如何在Laravel中使用具有多态关系的"group by"?

ATL*_*ris 11 php polymorphism relationship laravel

我有以下关系:

return $this->morphedByMany('App\Models\Movie', 'listable', 'cnt_lists', 'list_id')->withPivot('id', 'order', 'updated_at')->where('movies.has_poster', true)->orderBy('order', 'desc')->withTimestamps();
Run Code Online (Sandbox Code Playgroud)

该关系产生此查询:

select `movies`.*, `cnt_lists`.`list_id` as `pivot_list_id`, `cnt_lists`.`listable_id` as `pivot_listable_id`, `cnt_lists`.`id` as `pivot_id`, `cnt_lists`.`order` as `pivot_order`, `cnt_lists`.`updated_at` as `pivot_updated_at`, `cnt_lists`.`created_at` as `pivot_created_at` from `movies` inner join `cnt_lists` on `movies`.`id` = `cnt_lists`.`listable_id` where `movies`.`has_poster` = '1' and `cnt_lists`.`list_id` in ('3176', '3283', '3285', '3287') and `cnt_lists`.`listable_type` = 'App\Models\Movie' order by `order` desc
Run Code Online (Sandbox Code Playgroud)

这种关系有效,但它为每个列表抓取了许多.我试图限制每个列表只有一个.我最初在探索,take()但这限制了整个结果集,而不是每个列表限制.然后我想我可以分组,cnt_lists.list_id每个列表会抓一个.这似乎让我得到了我想要的东西.下面是适合我的查询,我只是想弄清楚如何在关系中使用group by,因为它在我添加它时打破了关系.

select `movies`.*, `cnt_lists`.`list_id` as `pivot_list_id`, `cnt_lists`.`listable_id` as `pivot_listable_id`, `cnt_lists`.`id` as `pivot_id`, `cnt_lists`.`order` as `pivot_order`, `cnt_lists`.`updated_at` as `pivot_updated_at`, `cnt_lists`.`created_at` as `pivot_created_at` from `movies` inner join `cnt_lists` on `movies`.`id` = `cnt_lists`.`listable_id` where `movies`.`has_poster` = '1' and `cnt_lists`.`list_id` in ('3176', '3283', '3285', '3287') and `cnt_lists`.`listable_type` = 'App\Models\Movie' group by `cnt_lists`.`list_id` order by `order` desc
Run Code Online (Sandbox Code Playgroud)

当我添加groupBy关系时:

return $this->morphedByMany('App\Models\Movie', 'listable', 'cnt_lists', 'list_id')->withPivot('id', 'order', 'updated_at')->where('movies.has_poster', true)->groupBy('cnt_lists.list_id')->orderBy('order', 'desc')->withTimestamps();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

select `movies`.*, `cnt_lists`.`list_id` as `pivot_list_id`, `cnt_lists`.`listable_id` as `pivot_listable_id`, `cnt_lists`.`id` as `pivot_id`, `cnt_lists`.`order` as `pivot_order`, `cnt_lists`.`updated_at` as `pivot_updated_at`, `cnt_lists`.`created_at` as `pivot_created_at` from `movies` inner join `cnt_lists` on `movies`.`id` = `cnt_lists`.`listable_id` where `movies`.`has_poster` = 1 and `cnt_lists`.`list_id` in (3176, 3283, 3285, 3287) and `cnt_lists`.`listable_type` = App\Models\Movie group by `cnt_lists`.`list_id` order by `order` desc
Run Code Online (Sandbox Code Playgroud)

出于某种原因,模型App\Models\Movie不在引号中,因此它会破坏整个查询.如果我手动运行查询它可以工作,我只需要为多态模型添加引号.即"App\Models\Movie"

ATL*_*ris 2

好的,事实证明该问题与 MySQL 严格模式(包括ONLY_FULL_GROUP_BY模式)有关。

我在 Laravel 级别禁用了严格模式,查询现在按预期工作。只需在连接的数据库配置文件中设置为strictto即可。false

'strict' => false,
Run Code Online (Sandbox Code Playgroud)