我处在一种情况下,我有很多关系,而且当我进行大量查询时,它会变慢一个问题。
例如,我正在为所有博客做一个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代码放在刀片文件中。我怎么能避免这样做?我已经尝试在数据库中使用缓存,但是它也对数据库中的缓存表进行了一些查询。我也在使用热切的装载,这已经帮助了很多。但我怎样才能做到最好呢?
非常感谢您的回复。
答案 0 :(得分:4)
这称为N + 1问题。您应该首先学习如何使用Eager loading并加载关系。然后迭代收集以向用户显示数据。
从文档中急切加载多个关系的示例:
$books = App\Book::with('author', 'publisher')->get();
@Achraf Khouadja建议的示例和tutorial:
$blogs = blog::with('lastCommenter', 'user')->get();