laravel - 减少查询量,页面加载缓慢
问题描述
我试图通过“急切加载”线程的回复分页来最小化我正在使用的查询数量。但我有点不确定该怎么做。下面是代码:
$unpinnedThreads = Thread::all()->sortByDesc(function($thread) {
$replies = $thread->replies->sortByDesc('created_at');
$lastTouchedPost = Carbon::minValue();
if (!empty($replies->toArray())) {
$lastTouchedPost = $lastTouchedPost->max($replies->first()->created_at);
}
return $lastTouchedPost->max($thread->created_at);
});
看法:
@foreach($thread->replies->paginate(15)->setPath($thread->path())->getUrlRange(ceil($thread->replies->count()
/ 15 - 2), ceil($thread->replies->count() / 15)) as $key => $pagination)
@if($key > 1)
<a href="{{ $pagination }}">{{ $key }}</a>
@endif
@endforeach
到目前为止,我在调试栏中有很多查询,如下所示:
select * from `replies` where `replies`.`thread_id` = ? and `replies`.`thread_id` is not null
我想知道如何减少查询次数。
当我编码时:Thread::with('replies')->sortByDesc->,它会调用未定义的方法。但是,当我编码 ->with('replies') 时,它会抛出一个错误,上面写着:
Method Illuminate\Database\Eloquent\Collection::with does not exist.
谁能帮帮我吗?
谢谢你。
编辑::
我推断问题出在我的方法中:
$unpinnedThreads = Thread::all()->sortByDesc(function($thread) {
$replies = $thread->replies->sortByDesc('created_at');
$lastTouchedPost = Carbon::minValue();
if (!empty($replies->toArray())) {
$lastTouchedPost = $lastTouchedPost->max($replies->first()->created_at);
}
return $lastTouchedPost->max($thread->created_at);
});
有谁知道我可以如何优化该方法?
解决方案
这真的很奇怪。看来您正在调用with()
模型Thread::with('replies')
,但错误是说您正在集合上调用它。集合对象没有with()
方法。
下面的代码应该可以工作:
$collection = Thread::with(['replies'])->get()->sortByDesc(function($thread)
{
if (count($thread->replies))
{
return $thread->replies->sortBy('created_at')->last()->created_at;
}
else
{
return $thread->created_at;
}
});
如果不使用默认值,created_at
必须配置:
protected $casts = [
'created_at' => 'date',
]
不要忘记在Thread
模型中创建关系:
public function replies()
{
return $this->hasMany(Reply::class, 'thread_id', 'id');
}
推荐阅读
- java - Java Getter 和 Setter 在 Swing ActionListner 中不起作用
- python - 使用 PIL 包在图像上编写日语文本
- go - Kafka 偏移量有时会在消费者重启后重置
- visual-studio-code - Tensorboard 在浏览器和 vscode 中什么都不显示
- pandas - 这对行和列意味着什么?
- python - 在 Python 中的 Visual Stdio Code 中导入 ocrmypdf
- deep-learning - MASK-RCNN的自定义训练类怎么写?
- javascript - 新成员加入 wix 时自动分配角色
- android - Firebase 云消息传递返回无效注册
- javascript - 从 React Hooks 中的购物项目中删除项目