首页 > 解决方案 > 减少查询量,页面加载缓慢

问题描述

我试图通过“急切加载”线程的回复分页来最小化我正在使用的查询数量。但我有点不确定该怎么做。下面是代码:

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

有谁知道我可以如何优化该方法?

标签: laravel

解决方案


这真的很奇怪。看来您正在调用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');
}

推荐阅读