Laravel Eloquent,添加有限行的关系变为空
Posted
技术标签:
【中文标题】Laravel Eloquent,添加有限行的关系变为空【英文标题】:Laravel Eloquent, adding relation with limited rows turns up empty 【发布时间】:2020-01-01 03:03:40 【问题描述】:我正在使用 Spatie Querybuilder (v1.11) 返回过滤和分页的结果。这反过来又使用了 Laravel Eloquent。该查询返回许多具有相关媒体项目的专辑,我想限制每个专辑的媒体项目数量。相反,“媒体”属性返回空。
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,而不是每个专辑。 不过我找到了解决方案(见下文)。
【问题讨论】:
【参考方案1】:由于我需要为每个专辑获取 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;
【讨论】:
以上是关于Laravel Eloquent,添加有限行的关系变为空的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5 Eloquent在多个级别上向JSON添加关系
Laravel Eloquent:获取嵌套关系中的数据总和并将其添加为新属性
Laravel Eloquent 关系——相当于 MYSQL “join”