Php 嵌套关系在第一个结果之后停止工作
以下是我目前的查询:Php 嵌套关系在第一个结果之后停止工作,php,laravel,eloquent,laravel-5.3,Php,Laravel,Eloquent,Laravel 5.3,以下是我目前的查询: $messages = Message::select('messages.*') ->where('post_id', 1) ->where('parent_id', 0) ->with(['children' => function ($query) { $query->take(3); }]) ->paginate(10); 下面是我的Message.php类中的子类
$messages = Message::select('messages.*')
->where('post_id', 1)
->where('parent_id', 0)
->with(['children' => function ($query)
{
$query->take(3);
}])
->paginate(10);
下面是我的Message.php
类中的子类
关系:
public function children() {
return $this->hasMany('App\Message', 'parent_id', 'id');
}
这是我试图获得的输出:
- Message 1
- Message 1.1
- Message 1.2
- Message 1.3
- Message 2
- Message 2.1
- Message 2.2
- Message 2.3
- Message 3
- Message 3.1
- Message 3.2
- Message 3.3
- etc
但相反,它返回的是:
- Message 1
- Message 1.1
- Message 1.2
- Message 1.3
- Message 2
- Message 3
- etc
查询似乎只返回第一个结果的子级,而没有返回第二个结果
我做错了什么?如何修复查询以获得所需的结果?首先,要回答“我做错了什么?”的问题,如果您按照以下步骤进行快速加载,您将看到您构建的查询转化为:
select * from messages
select * from children where id in (1, 2, 3, 4, 5, ...) limit 3
(注意,我创建了子表名
表名,因为我不知道您使用的是什么名称。)
检索记录后,Eloquent将完全按照您的要求构建其对象:所有消息及其所有子消息-限制为3行。这就是为什么您只获得第一条消息的子项
现在,如果您想坚持使用急切加载,只需使用
方法摆脱中的闭包即可:
$messages = Message::select('messages.*')
->where('post_id', 1)
->where('parent_id', 0)
->with('children') /* the constraint is gone */
->paginate(10);
通过此分页结果,您可以访问all消息和all各自的子项。接下来,例如,在控制器中,您可以通过过滤结果或手动将每个子组限制为3来修改结果。或者,您可以快速而肮脏地执行此操作,并直接在视图中使用带有中断的循环
但是不要做得又快又脏。如果一封邮件有10000个孩子,这个解决方案不会检索所有10000个孩子吗?然后我必须过滤掉9997才能得到3?当然,你会得到所有的子项,但是你正在使用的受约束的和也一样-你仍然会检索所有的子项,只是你在得到它们之后限制它们。我所说的“你”其实是指“MySQL”。如果是这样的话,这将对性能产生巨大的影响。如果我把1万个孩子过滤到3个,那对我来说是没有意义的。我同意。我给出的解决方案是一个基本的蓝图。它是否适合你,由你决定。希望你能找到答案。看看这篇文章——我计划在将来获得关于儿童的信息,据我所知,这篇教程没有涵盖这种情况。如果这些信息在问题中,那会很有帮助。