当使用with()+take()方法时,Laravel-Eloquent只返回与第一个文档相关的元素



我正在尝试获取用户文档以及前三个相关的会议文档。

User::with(
[
'meetings' => function($query) {
$query->take(3);
}
]
)->get();

App\Models\user.php中的用户会议关系:

public function meetings(){
return $this->hasMany(Meeting::class);
}

但结果,我只收到与第一个用户相关的会议:

[
{
"_id": "63123a4906650000d2006de2",
...
"meetings": [
{
"_id": "63123e0590530000860042bd",
"user_id": "63123a4906650000d2006de2",
"start_time": "2022-08-29T12:00:00.000000Z",
"updated_at": "2022-09-02T17:31:49.601000Z",
"created_at": "2022-09-02T17:31:49.601000Z"
},
{
"_id": "63123e0590530000860042be",
"user_id": "63123a4906650000d2006de2",
"start_time": "2022-08-29T12:15:00.000000Z",
"updated_at": "2022-09-02T17:31:49.602000Z",
"created_at": "2022-09-02T17:31:49.602000Z"
},
{
"_id": "63123e0590530000860042bf",
"user_id": "63123a4906650000d2006de2",
"start_time": "2022-08-29T12:30:00.000000Z",
"updated_at": "2022-09-02T17:31:49.603000Z",
"created_at": "2022-09-02T17:31:49.603000Z"
}
]
},
{
"_id": "63123af290530000860042b2",
...
"meetings": [

]
},
{
"_id": "63123b0c90530000860042b5",
...
"meetings": [

]
}
]

在不使用take((的情况下,将加载所有相关的会议文档。

我正在使用jensegers-mongodb包进行laravel-mongodb连接,但这个问题也发生在vanillance上

就像@apokryfos建议的那样,take()雄辩的方法只是在查询的末尾添加"limit"字。这种类型的查询更为复杂,vanillance不支持这种查询。

幸运的是,还有一个名为雄辩渴望极限的附加包,它有助于解决这个问题。为了使其工作,请使用composer require staudenmeir/eloquent-eager-limit命令安装该包,并将use StaudenmeirEloquentEagerLimitHasEagerLimit;行放在父模型类和子模型类中。

遗憾的是,mongodb不受支持,而且在使用mongodb时似乎没有有效的方法来实现这一点。我想到的一些选择是:

  1. 在没有雄辩的帮助下编写查询,例如使用DB::query()
  2. 检索所有记录、显示或映射所需的记录
  3. 编写自己的程序包:D

相关内容

最新更新