【问题标题】:Why is it not possible to use groupBy() in an eager loading query - Laravel为什么不能在急切加载查询中使用 groupBy() - Laravel
【发布时间】:2020-08-11 12:42:55
【问题描述】:

错误异常:

stripos() expects parameter 1 to be string, object given

对于with() 方法中的groupBy() 调用

$user = User::with([
    'pricelists' => function($query) {
        $query->groupBy(function($var) {
            return Carbon::parse($var->pivot->created_at)->format('m');
        });
     }
])->where('id', $id)->get();

我已经看到一些帖子谈论如何管理这个问题,并且不可能在 eloquent 中使用groupBy(),但我真的不明白为什么......

要明确:

UserPricelist 模型与默认的 timestamps() 方法建立了多对多关系。我正在尝试按从当前用户下载的月份对下载的价目表进行分组。

经过几次尝试,我刚刚从with() 方法中删除了上面显示的=> function($query... 语句,然后只留下with(['pricelist']) 来获取所有数据集并尝试了这个:

$user->pricelists = $user->pricelists->groupBy(function($var) {
    return Carbon::parse($var->pivot->created_at)->format('m');
});
return $user->pricelists;

它工作正常,每个月返回一个包含多个数组的数组...但是像这样返回它:

return $user;

只返回 1 个包含所有条目的数组...我现在并没有真正理解它背后的意义...

【问题讨论】:

    标签: php laravel eloquent eager-loading


    【解决方案1】:

    您在提供的两个代码中使用的两个groupBy() 方法是完全不同的方法。

    您在回调中使用它的第一个groupBy() 实际上是由$query 调用的,它是一个query builder 对象。这里的groupBy() 用于将SQL GROUP BY Statement 添加到查询中。根据documentation,它只接受字符串变量作为参数。

    第二个代码中的groupBy()$user->pricelists 调用,这是一个laravel eloquent collection。这里的groupBy()方法实际上来自于基础集合类,用于将集合内部的项目在传递给函数的参数定义的不同键下分组为多个集合。请阅读文档here

    对于您的情况,第二个groupBy() 是您应该使用的,因为您计划使用回调并且允许您使用更复杂的逻辑。

    【讨论】:

    • 我实际上想知道为什么在官方 laravel 文档中有两种不同的 groupBy() 描述。感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2023-03-25
    相关资源
    最近更新 更多