为什么在急切的加载查询中无法使用groupBy()-Laravel

时间:2020-04-27 20:16:12

标签: php laravel eloquent eager-loading

ErrorException:

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

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

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

我已经看过几篇有关如何解决此问题的文章,并且不能雄辩地使用groupBy(),但我真的不明白为什么...

要清楚:

UserPricelist模型通过默认的timestamps()方法获得了多对多关系。我试图将下载的价目表按从当前用户下载的月度分组。

经过几次尝试,我刚刚从=> function($query...方法中删除了上面显示的with()语句,只是离开了with(['pricelist'])以获取所有数据集并尝试了此方法:

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

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

return $user;

仅返回所有条目的1个数组...我现在还不了解它的含义...

1 个答案:

答案 0 :(得分:2)

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

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

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

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