2016-11-21 113 views
1

我有一個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查詢中做到這一點?

謝謝。

回答

0

我解決它,這是最接近我能到儘可能少原始查詢(或作爲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(); 
1

確保在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

1

從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; 
}