雄辩的查询获得分组相关模型的计数
问题描述:
我有一个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
关系。
例:(假设你在命名空间App
有UserAction
模型)
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
方法进行一对多关系。
如果你要计算的结果从关系的数量,而无需实际加载它们,你可以使用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;
}