gpt4 book ai didi

php - 嵌套关系在第一个结果后停止工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:46:29 25 4
gpt4 key购买 nike

这是我目前的查询:

$messages = Message::select('messages.*')
->where('post_id', 1)
->where('parent_id', 0)
->with(['children' => function ($query)
{
$query->take(3);
}])
->paginate(10);

这是我的 Message.php 类中的 children 关系:

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

查询似乎只返回第一个结果的 child ,但没有其他结果。

我做错了什么?如何修正我的查询以获得我需要的结果?

最佳答案

首先,要回答“我做错了什么?”这个问题,如果您遵循 documentation对于 Eloquent 预加载,您会看到您构建的查询转换为:

select * from messages

select * from children where id in (1, 2, 3, 4, 5, ...) limit 3

(请注意,children 表名是我编造的,因为我不知道您使用的是什么名称。)

检索记录后,Eloquent 将构建其对象,完全使用您要求的内容:所有消息及其所有子项 - 限制为 3 行。这就是为什么你只得到第一个 child 的原因 Message .


现在,如果你想坚持预加载,你可以简单地去掉 with 中的闭包。方法:

$messages = Message::select('messages.*')
->where('post_id', 1)
->where('parent_id', 0)
->with('children') /* the constraint is gone */
->paginate(10);

有了这个分页结果,您将可以访问所有 Messages所有他们各自的 child 。接下来,例如在 Controller 中,您可以通过过滤结果或手动将每个子组限制为 3 来修改结果。或者,您可以快速而肮脏地进行操作并使用带有 break 的循环直接在您的 View 中。

但不要快速而肮脏地进行。

关于php - 嵌套关系在第一个结果后停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44488039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com