Laravel Eloquent,添加有限行的关系结果为空
Laravel Eloquent, adding relation with limited rows turns up empty
我正在使用 Spatie Querybuilder (v1.11) return 过滤和分页结果。这反过来又在使用 Laravel Eloquent。查询 return 是一些具有相关媒体项的相册,我想限制每个相册的媒体项数量。相反,“媒体”属性 return 是空的。
public function index(Request $request)
{
$query = QueryBuilder::for(Album::class)
->with(['media' => function($query) {
$query->limit(4);
}])
->get();
return $query;
记录查询看起来不错:
"query": "select * from `media` where `media`.`model_id` in (1, 2, 3, 4, 5,
6, 7, 8, 9) //<-- and so on, continues to 227
limit 4"
但结果是一个空的“媒体”:
"data": [
{
"id": 227,
"name": "Good",
"media": []
如果我不使用“限制”规范而只使用 ->with('media'),我会得到所有图像,但每个媒体我只想要 4 张。
更新
该问题与 Spatie Querybuilder 无关。我错了,媒体是空的,实际上第一行有 4 个媒体项目,但由于结果按降序显示,我认为所有相册都有空项目。
所以问题是查询将完整结果的项目数限制为 4,而不是每个专辑。
不过我找到了解决方案(见下文)。
因为我需要每张专辑获取 4 个项目,所以我首先查询获取专辑:
$query = QueryBuilder::for(Album::class)
->allowedSorts('created_at')
->has('media'); //<-- only albums that has media
$result = $query->paginate()->toArray();
然后我循环结果并得到相关的项目(每个 4 个)并将其作为 属性 附加到结果:
//Loop the albums and for each album add 4 of its related media
foreach($result['data'] as &$album) {
$mediaItems = Media::where('model_id', $album['id'])
->limit(4)
->get();
$album['media'] = $mediaItems; // <------
}
return $result;
我正在使用 Spatie Querybuilder (v1.11) return 过滤和分页结果。这反过来又在使用 Laravel Eloquent。查询 return 是一些具有相关媒体项的相册,我想限制每个相册的媒体项数量。相反,“媒体”属性 return 是空的。
public function index(Request $request)
{
$query = QueryBuilder::for(Album::class)
->with(['media' => function($query) {
$query->limit(4);
}])
->get();
return $query;
记录查询看起来不错:
"query": "select * from `media` where `media`.`model_id` in (1, 2, 3, 4, 5,
6, 7, 8, 9) //<-- and so on, continues to 227
limit 4"
但结果是一个空的“媒体”:
"data": [
{
"id": 227,
"name": "Good",
"media": []
如果我不使用“限制”规范而只使用 ->with('media'),我会得到所有图像,但每个媒体我只想要 4 张。
更新
该问题与 Spatie Querybuilder 无关。我错了,媒体是空的,实际上第一行有 4 个媒体项目,但由于结果按降序显示,我认为所有相册都有空项目。 所以问题是查询将完整结果的项目数限制为 4,而不是每个专辑。 不过我找到了解决方案(见下文)。
因为我需要每张专辑获取 4 个项目,所以我首先查询获取专辑:
$query = QueryBuilder::for(Album::class)
->allowedSorts('created_at')
->has('media'); //<-- only albums that has media
$result = $query->paginate()->toArray();
然后我循环结果并得到相关的项目(每个 4 个)并将其作为 属性 附加到结果:
//Loop the albums and for each album add 4 of its related media
foreach($result['data'] as &$album) {
$mediaItems = Media::where('model_id', $album['id'])
->limit(4)
->get();
$album['media'] = $mediaItems; // <------
}
return $result;