如何在Laravel中使用具有多态关系的"group by"?
How to use "group by" with a polymorphic relationship in 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();
该关系产生此查询:
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
这种关系有效,但它为每个列表抓取了很多。我试图将每个列表限制为一个。我最初是在探索 take()
但这限制了整个结果集,而不是每个列表的限制。然后我想我可以按 cnt_lists.list_id
分组,每个列表抓取一个。这似乎让我得到了我正在寻找的东西。以下是对我有用的查询,我只是想弄清楚如何在关系中使用分组依据,因为它在我添加时会破坏关系。
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
当我在关系中添加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();
我收到以下错误:
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
出于某种原因,模型 App\Models\Movie
未在引号中,因此它中断了整个查询。如果我 运行 手动查询它有效,我只需要向多态模型添加引号。即 "App\Models\Movie"
好的,原来这个问题与 MySQL 严格模式有关,其中包括 ONLY_FULL_GROUP_BY
模式。
我在 Laravel 级别禁用了严格模式,查询现在按预期工作。只需在连接的数据库配置文件中将 strict
设置为 false
。
'strict' => false,
我收到了你的问题和答案。根据您的回答,我知道主要问题是 "Strict mode," 这实际上只是 5.7 默认启用的模式列表。有时我们的人不了解 strict mode
。在 https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel-5-2 这个 link ,你会得到如何 Enabling and disabling strict mode in Laravel 5.2
例如
这些设置位于 config/database.php 的 connections.mysql 部分。对于初学者,让我们看看启用和禁用 "strict" 模式:
'connections' => [
'mysql' => [
// Behave like MySQL 5.6
'strict' => false,
// Behave like MySQL 5.7
'strict' => true,
]
]
我们也可以通过以下方式自定义它:
'connections' => [
'mysql' => [
// Ignore this key and rely on the strict key
'modes' => null,
// Explicitly disable all modes, overriding strict setting
'modes' => [],
// Explicitly enable specific modes, overriding strict setting
'modes' => [
'STRICT_TRANS_TABLES',
'ONLY_FULL_GROUP_BY',
],
]
]
谢谢
我有以下关系:
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();
该关系产生此查询:
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
这种关系有效,但它为每个列表抓取了很多。我试图将每个列表限制为一个。我最初是在探索 take()
但这限制了整个结果集,而不是每个列表的限制。然后我想我可以按 cnt_lists.list_id
分组,每个列表抓取一个。这似乎让我得到了我正在寻找的东西。以下是对我有用的查询,我只是想弄清楚如何在关系中使用分组依据,因为它在我添加时会破坏关系。
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
当我在关系中添加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();
我收到以下错误:
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
出于某种原因,模型 App\Models\Movie
未在引号中,因此它中断了整个查询。如果我 运行 手动查询它有效,我只需要向多态模型添加引号。即 "App\Models\Movie"
好的,原来这个问题与 MySQL 严格模式有关,其中包括 ONLY_FULL_GROUP_BY
模式。
我在 Laravel 级别禁用了严格模式,查询现在按预期工作。只需在连接的数据库配置文件中将 strict
设置为 false
。
'strict' => false,
我收到了你的问题和答案。根据您的回答,我知道主要问题是 "Strict mode," 这实际上只是 5.7 默认启用的模式列表。有时我们的人不了解 strict mode
。在 https://mattstauffer.co/blog/strict-mode-and-other-mysql-customizations-in-laravel-5-2 这个 link ,你会得到如何 Enabling and disabling strict mode in Laravel 5.2
例如
这些设置位于 config/database.php 的 connections.mysql 部分。对于初学者,让我们看看启用和禁用 "strict" 模式:
'connections' => [
'mysql' => [
// Behave like MySQL 5.6
'strict' => false,
// Behave like MySQL 5.7
'strict' => true,
]
]
我们也可以通过以下方式自定义它:
'connections' => [
'mysql' => [
// Ignore this key and rely on the strict key
'modes' => null,
// Explicitly disable all modes, overriding strict setting
'modes' => [],
// Explicitly enable specific modes, overriding strict setting
'modes' => [
'STRICT_TRANS_TABLES',
'ONLY_FULL_GROUP_BY',
],
]
]
谢谢