Laravel 减少查询量,页面加载速度慢
我试图通过“急切加载”线程的回复分页来最小化我使用的查询量。但我有点不确定怎么做。代码如下:Laravel 减少查询量,页面加载速度慢,laravel,Laravel,我试图通过“急切加载”线程的回复分页来最小化我使用的查询量。但我有点不确定怎么做。代码如下: $unpinnedThreads = Thread::all()->sortByDesc(function($thread) { $replies = $thread->replies->sortByDesc('created_at'); $lastTouchedPost = Carbon::minVal
$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);
});
视图:
我想知道如何减少查询的数量
当我编写代码时:Thread::with('replays')->sortByDesc->,它会抛出对未定义方法的调用。但是,当我使用('repress')编写->代码时,它会抛出一个错误,该错误表示:
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);
});
有人知道我如何优化该方法吗?答案如下:
“我建议的一个解决方案是让回复者触及主题
通过这种方式,您可以始终按主题的更新时间排序,因为无论何时创建/编辑回复,它都会更新主题
要实现这一点,您只需添加:
受保护的$touchs=['topic'];
上面假设回复模型中topics关系的方法名为topic()
希望这有帮助!真奇怪。在模型
Thread::with('replays')
中,您似乎正在调用with()
,但错误是您正在集合上调用它。集合对象没有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;
}
});
如果不使用默认值,则必须配置在处创建的:
protected $casts = [
'created_at' => 'date',
]
不要忘记在线程
模型中创建关系:
public function replies()
{
return $this->hasMany(Reply::class, 'thread_id', 'id');
}
protected $casts = [
'created_at' => 'date',
]
public function replies()
{
return $this->hasMany(Reply::class, 'thread_id', 'id');
}