我正在制作一个婚礼策划应用程序,用户可以将他们的客人添加到特定的桌子、群组等......
我正在尝试列出所有群组,并在每个群组内显示该群组中的每个访客(在同一页面中,如手风琴中)
看起来很简单,而且它可以工作,但是在使用DebugBar时,我可以看到它发出了 2 个完全相同的查询,而我无论如何也找不到原因。
一个活动可以有多个组,每个组可以有多个嘉宾。
$event = Event::find($id_event);
$event->load('group');
$event->group->load([
"guest" => function ($q) {
return $q->paginate(10);
}
]);
编辑
忘了提一下,如果我添加任何其他关系,它也会重复它们。
$event->group->load([
'guest.plusone',
"guest" => function ($q) {
$q->paginate(10);
}
]);
编辑2
在尝试按照您的建议去做时,我发现了导致其的原因,但仍然不知道为什么。
当我尝试按照你的建议去做时,我得到了同样的结果
$event->load(['group', 'group.guest' => function ($query) {
$query->paginate(10);
}]);
但如果我删除分页的回调,我只会得到一个查询。这是正常的吗?我知道分页会执行一个额外的查询来获取总结果,但在这种情况下,它会进行 3 个查询,其中 2 个完全相同
首先,对于您正在做的事情,2 个查询的结果是非常预期的。请参阅下面的解释:
解释:
调用 paginate 时,您正在强制运行查询,该查询与关系定义在此之前构建的查询相同。调用 时也会发生同样的情况
$with->get()
。但是闭包并不期望您运行查询,也不关心此事,只修改其中提供的查询。因此,在通过 运行查询后paginate
,请注意其结果未在任何地方使用,闭包结束,Laravel 像平常一样运行关系预加载查询。对于 Laravel 11:
对于您想要实现的目标,将加载的关系模型限制为每组 10 个,您需要使用限制。限制不会运行查询,但会修改查询对象以在运行时包含限制。
Laravel 11 之前版本:
虽然您可以在 Laravel 10 中执行相同操作,但您得到的结果并不相同。限制将适用于所有已加载的客人,而不是每个组。因此,如果您有 A 组和 B 组,每组有 10 位客人。结果数据将包括 A 组的 10 位客人,但 B 组的 0 位客人。这是因为总共只加载了 10 位客人,而不是每个组 10 位客人。
要实现相同的功能,您需要将https://github.com/staudenmeir/eloquent-eager-limit包含到您的项目中并按照其说明进行操作。(在 Laravel 11 中,此包已合并)