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:获取嵌套关系中的数据总和并将其添加为新属性

Laravel Eloquent 关系——相当于 MYSQL “join”

Laravel/Eloquent 规范化 JSON 响应的关系?

Laravel Eloquent 按关系计数排序