【问题标题】:laravel unique() dont work with paginatinglaravel unique() 不适用于分页
【发布时间】:2020-01-16 09:36:36
【问题描述】:

我在 laravel 5.7.28 中遇到了一个问题,我正在尝试使用我的所有字段获取记录并对其进行分页,遗憾的是我的代码中有一个错误导致注册用户的电话号码重复(a用户注册了不止一次,当然我修复了错误),现在我面临一个场景,我想在他们的手机上获取我的(非重复的)不同的用户,并对他们进行分页。这是一厢情愿的场景:

$users = User::distinct('phone')
->doesntHave('carrierUsers')
->doesntHave('thirdparty')
->latest()->paginate(40);

它返回所有用户(电话号码重复),似乎不同的功能不受影响,所以我尝试了独特的功能:

$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 中使用它? 我的意思是我需要所有列,我怎样才能在 groupBy 子句中拥有所有这些列?顺便问一下这是什么意思?

,错误提示:这与 sql_mode=only_full_group_by 不兼容。她让这件事发生吗?我该如何解决? 1)对不起我的英语 2) 感谢您阅读全文 3) 很高兴回复并帮助我

【问题讨论】:

    标签: laravel group-by pagination unique distinct


    【解决方案1】:

    问题 1:使用 distinct

    distinct()方法不支持传参,所以distinct(phone)不起作用。

    您可以改用->select('phone')->distinct()。但是,选择了支持唯一列。

    问题 2:使用分组方式

    所以如果你想选择所有列并且唯一的一列,你可以使用group by

    因为您使用的是 mysql 5.7+。

    在 MySQL 5.7.5 中添加了 ONLY_FULL_GROUP_BY 和 STRICT_TRANS_TABLES 模式。

    因此,如果您选择所有列并将一列分组,您将收到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,
    ],
    

    【讨论】:

    • 谢谢,解决方案一(您推荐的解决方案)完成了这项工作。
    • @alireza 不客气,请给我点赞或接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2017-09-14
    • 2015-08-11
    • 2015-02-09
    • 2014-05-29
    • 1970-01-01
    相关资源
    最近更新 更多