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');
}