雄辩的查询获得分组相关模型的计数

雄辩的查询获得分组相关模型的计数

问题描述:

我有一个Action模型,其中有很多UserAction s。我需要计算每个Action有多少UserActions。一个SQL是这样的:雄辩的查询获得分组相关模型的计数

SELECT *, count(*) as count 
FROM user_actions JOIN actions 
    ON user_actions.action_id=actions.id 
GROUP BY actions.id; 

而我只是想知道是否有办法在Eloquent查询中做到这一点?

谢谢。

我解决它,这是最接近我能到尽可能少原始查询(或作为Eloquent-y)。

UserAction::select(DB::raw('actions.id, actions.name, COUNT(*) AS count')) 
        ->join('actions', 'actions.id', '=', 'user_actions.action_id') 
        ->groupBy('actions.id')->get(); 

确保在Action型号中设置了userActions关系。

例:(假设你在命名空间AppUserAction模型)

class Action extends Model 
{ 
    public function userActions() 
    { 
     return $this->belongsToMany('App\UserAction'); 
    } 
} 

然后,它是这样做很容易:

//$action = some action 

$count = $action->userActions->count(); 

雄辩关系返回集合:https://laravel.com/docs/5.3/eloquent-relationships

And count是一个由Eloquent集合(Laravel集合)提供的方法:https://laravel.com/docs/5.3/collections#method-count

从Laravel 5.2开始,您可以使用withCount方法进行一对多关系。

official documentation

如果你要计算的结果从关系的数量,而无需实际加载它们,你可以使用withCount方法,这将放置{关系} _count列上你的最终模型。例如:

$posts = App\Post::withCount('comments')->get(); 

foreach ($posts as $post) { 
    echo $post->comments_count; 
} 

在你的情况,如果你已经安装的关系,这样的事情应该工作:

$user_actions = App\UserActions::withCount('actions')->get(); 

foreach ($user_actions as $action) { 
    echo $action->actions_count; 
}