Eloquent查询以获取分组相关模型的计数

时间:2016-11-21 05:31:59

标签: php mysql sql laravel eloquent

我的Action模型有很多UserAction个。我需要计算每个UserActions的{​​{1}}个数。用于此的SQL是:

Action

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

感谢。

4 个答案:

答案 0 :(得分:1)

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

例:(假设您在命名空间UserAction中有App模型)

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

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

答案 1 :(得分:1)

我解决了这个问题,这是我能够尽可能接近原始查询(或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();

答案 2 :(得分:0)

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

来自official documentation

  

如果要计算关系中的结果数而不实际加载它们,可以使用withCount方法,该方法会在生成的模型上放置{relation} _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;
}

答案 3 :(得分:0)

  

我需要获取每个操作有多少个UserAction的计数   动作

假设UserAction可以采取不同类型的操作,并且可以通过action.type列加以区分,而不是通过Laravel来计算每个Action的出现方式

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

如果action.action_id等于action.type,则可以将其简化为

UserAction::select(DB::raw('action_id,  COUNT(*) AS count'))
            ->groupBy('action_id')->get();