Laravel - 刀片视图中的重复查询 - 减少查询数量

Tay*_*lor 2 php caching laravel

我处于这样一种情况,我有很多关系,并且当我进行大量查询时,它会减慢网站速度,这正成为一个问题。

例如,我正在为所有博客执行 foreach 循环并获取创建博客的用户。

@foreach ($blogs as $blog)
    <a href="{{ route('blog.view', str_slug($blog->title)) }}">{{ $blog->title }}</a>

    {{ $blog->created_at }}

    <a href="{{ viewProfile($blog->user) }}"><{{ $blog->user->username }}/a>

    Last Commenter:
    <a href="{{ viewProfile($blog->lastCommenter()->user) }}">
        {{ $blog->lastCommenter()->user->username }}
    </a>

@endforeach
Run Code Online (Sandbox Code Playgroud)

仅此一项就超过 50 多个查询。如果有 100 个博客,查询的数量就远远不够了。

我怎样才能避免这样做?我已将它存储在此视图中的一个变量中,但我不想真正将任何 PHP 代码放入刀片文件中。我怎样才能避免这样做?我曾尝试在数据库中使用缓存,但这也对数据库中的缓存表进行了一些查询。我也在使用急切加载,这有很大帮助。但是我怎样才能最好地做这种事情呢?

非常感谢您提前回复。

Ale*_*nin 5

这就是所谓的N+1问题。您应该首先学习如何使用Eager 加载和加载关系。然后迭代集合以向用户显示数据。

从文档中预先加载多个关系的示例:

$books = App\Book::with('author', 'publisher')->get();
Run Code Online (Sandbox Code Playgroud)

@Achraf Khouadja 建议的示例和教程

$blogs = blog::with('lastCommenter', 'user')->get();
Run Code Online (Sandbox Code Playgroud)