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

时间:2016-05-12 02:04:09

标签: php laravel caching

我处在一种情况下,我有很多关系,而且当我进行大量查询时,它会变慢一个问题。

例如,我正在为所有博客做一个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

仅此一项就是超过50个查询..如果有100个博客,那么查询的数量就会消失。

我怎样才能避免这样做?我已将其存储在此视图中的变量中,但我不想将任何PHP代码放在刀片文件中。我怎么能避免这样做?我已经尝试在数据库中使用缓存,但是它也对数据库中的缓存表进行了一些查询。我也在使用热切的装载,这已经帮助了很多。但我怎样才能做到最好呢?

非常感谢您的回复。

1 个答案:

答案 0 :(得分:4)

这称为N + 1问题。您应该首先学习如何使用Eager loading并加载关系。然后迭代收集以向用户显示数据。

从文档中急切加载多个关系的示例:

$books = App\Book::with('author', 'publisher')->get();

@Achraf Khouadja建议的示例和tutorial

$blogs = blog::with('lastCommenter', 'user')->get();