[英]Laravel Eloquent: Reduce number of queries
假设我的users
表中有250个用户,每个用户有一本书或多本书,每本书有一个或多个章节。 现在,我要打印用户名及其书名。
控制器:
$users = User::all();
在刀片中:
@foreach($users as $user)
<tr>
<td>{{ $user->id }}</td>
<td>{{ $user->name }}</td>
<td>
@foreach($user->books as $book)
{{ $book->name }},
@endforeach
</td>
</tr>
@endforeach
# of queries 252
现在要克服n + 1问题,查询应该是
$users = User::with('books')->get();
现在查询的数量只有2个。
我想打印带有这样的章节数的书名-> BookName(章节数)。 所以在我的刀片
@foreach($users as $user)
<tr>
<td>{{ $user->id }}</td>
<td>{{ $user->name }}</td>
<td>
@foreach($user->books as $book)
{{ $book->name }} ({{ $book->chapters->count() }}),
@endforeach
</td>
</tr>
@endforeach
因此,对于750本书(含1500章),查询数量约为752,如果章节数增加,查询数量也会增加。
有什么更好的Eloquent方式来减少它,还是应该进行原始SQL查询?
从雄辩的文件 :
嵌套的渴望加载
为了渴望加载嵌套关系,可以使用“点”语法。 例如,让我们急切地在一项雄辩的陈述中加载本书的所有作者和所有作者的个人联系人:
$books = App\\Book::with('author.contacts')->get();
对于您的情况,可以使用以下方法检索所需的嵌套关系:
User::with('books.chapters')->get();
您无需加载所有章节数据,然后手动计算每个集合。 使用withCount()
代替:
$users = User::with('books')->withCount('chapters')->get();
如果您想计算一个关系的结果数而不实际加载它们,则可以使用withCount方法,该方法将在结果模型上放置一个{relation} _count列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.