laravel unique() 不适用于分页
laravel unique() dont work with paginating
我在 laravel 5.7.28 中遇到了一个问题,我正在尝试获取所有字段的记录并对它们进行分页,遗憾的是我的代码中有一个错误导致注册用户重复 phone number(一个用户自己注册了不止一次,当然我修复了这个错误),现在我正面临一个场景,我想在他们的 [=35 上获取我的(非重复的)不同的用户=],并对它们进行分页。这是一厢情愿的场景:
$users = User::distinct('phone')
->doesntHave('carrierUsers')
->doesntHave('thirdparty')
->latest()->paginate(40);
它 returns 所有用户(具有重复的 phone 号码),似乎不同的功能不受影响,所以我尝试了独特的功能:
$users = User::doesntHave('carrierUsers')
->doesntHave('thirdparty')
->latest()->paginate(40)->unique('phone');
它有效(为了不重复)但破坏了分页功能
和
$users = User::doesntHave('carrierUsers')
->doesntHave('thirdparty')
->latest()
->unique('phone')
->paginate(40);
我在生成器上遇到未定义函数的错误,这意味着它适用于集合,
我也试过 groupBy(在整个网络上搜索解决方案),直到我使用它时它让我感到困惑
User::doesntHave('carrierUsers')->doesntHave('thirdparty')
->latest()->groupBy('phone')
->paginate(40);
我得到了 SELECT list is not in GROUP BY clause
,我应该在我的 groupBy 中使用它在我的 select 语句中的每个短语中的意思(现在是全部 ('*') )吗?
我的意思是我需要所有列,我怎样才能在 groupBy 子句中包含所有这些列?顺便问一下,这是什么意思?
,错误提示:这与 sql_mode=only_full_group_by 不兼容。她让这件事发生了吗?我该如何解决?
1)请原谅我的英语
2) 感谢阅读全文
3) 很高兴回复和帮助我
问题 1:使用 distinct
对于distinct()
方法,不支持传递参数,所以distinct(phone)
不会起作用。
您可以改用->select('phone')->distinct()
。但是,支持唯一列是 selected.
问题 2:使用分组依据
所以如果你想select所有列和唯一一列,你可以使用group by
.
并且因为您使用的是 mysql 5.7+.
The ONLY_FULL_GROUP_BY and STRICT_TRANS_TABLES modes were added in MySQL 5.7.5.
因此,如果您 select 所有列并将一列分组,您将收到 only_full_group_by
错误。
有两个选项可以解决这个问题。
解决方案1:
使用ANY_VALUE()
User::doesntHave('carrierUsers')->doesntHave('thirdparty')
->latest()
->selectRaw('phone, ANY_VALUE(id) AS id, ANY_VALUE(username) AS username, ...')
->groupBy('phone')
->paginate(40);
解决方案2:
在config/database.php配置中,设置严格模式为false
(这不是很安全):
'mysql' => [
'driver' => 'mysql',
...
'strict' => false,
],
我在 laravel 5.7.28 中遇到了一个问题,我正在尝试获取所有字段的记录并对它们进行分页,遗憾的是我的代码中有一个错误导致注册用户重复 phone number(一个用户自己注册了不止一次,当然我修复了这个错误),现在我正面临一个场景,我想在他们的 [=35 上获取我的(非重复的)不同的用户=],并对它们进行分页。这是一厢情愿的场景:
$users = User::distinct('phone')
->doesntHave('carrierUsers')
->doesntHave('thirdparty')
->latest()->paginate(40);
它 returns 所有用户(具有重复的 phone 号码),似乎不同的功能不受影响,所以我尝试了独特的功能:
$users = User::doesntHave('carrierUsers')
->doesntHave('thirdparty')
->latest()->paginate(40)->unique('phone');
它有效(为了不重复)但破坏了分页功能
和
$users = User::doesntHave('carrierUsers')
->doesntHave('thirdparty')
->latest()
->unique('phone')
->paginate(40);
我在生成器上遇到未定义函数的错误,这意味着它适用于集合, 我也试过 groupBy(在整个网络上搜索解决方案),直到我使用它时它让我感到困惑
User::doesntHave('carrierUsers')->doesntHave('thirdparty')
->latest()->groupBy('phone')
->paginate(40);
我得到了 SELECT list is not in GROUP BY clause
,我应该在我的 groupBy 中使用它在我的 select 语句中的每个短语中的意思(现在是全部 ('*') )吗?
我的意思是我需要所有列,我怎样才能在 groupBy 子句中包含所有这些列?顺便问一下,这是什么意思?
,错误提示:这与 sql_mode=only_full_group_by 不兼容。她让这件事发生了吗?我该如何解决? 1)请原谅我的英语 2) 感谢阅读全文 3) 很高兴回复和帮助我
问题 1:使用 distinct
对于distinct()
方法,不支持传递参数,所以distinct(phone)
不会起作用。
您可以改用->select('phone')->distinct()
。但是,支持唯一列是 selected.
问题 2:使用分组依据
所以如果你想select所有列和唯一一列,你可以使用group by
.
并且因为您使用的是 mysql 5.7+.
The ONLY_FULL_GROUP_BY and STRICT_TRANS_TABLES modes were added in MySQL 5.7.5.
因此,如果您 select 所有列并将一列分组,您将收到 only_full_group_by
错误。
有两个选项可以解决这个问题。
解决方案1:
使用ANY_VALUE()
User::doesntHave('carrierUsers')->doesntHave('thirdparty')
->latest()
->selectRaw('phone, ANY_VALUE(id) AS id, ANY_VALUE(username) AS username, ...')
->groupBy('phone')
->paginate(40);
解决方案2:
在config/database.php配置中,设置严格模式为false
(这不是很安全):
'mysql' => [
'driver' => 'mysql',
...
'strict' => false,
],