Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 嵌套关系在第一个结果之后停止工作_Php_Laravel_Eloquent_Laravel 5.3 - Fatal编程技术网

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个,那对我来说是没有意义的。我同意。我给出的解决方案是一个基本的蓝图。它是否适合你,由你决定。希望你能找到答案。看看这篇文章——我计划在将来获得关于儿童的信息,据我所知,这篇教程没有涵盖这种情况。如果这些信息在问题中,那会很有帮助。