我有三个模型(Organization, User, Visit)和4个表(organizations, users, organization_user, visitors)。我试图获得一个组织的用户访问的累计总数。
Organization
------------
id,
name
User
---------
id,
name
Organization_User
----------------
id,
organization_id,
user_id
Visit
--------------
id,
user_id
views
澄清一下,没有Organization_User模型,它只是User和Organization使用的数据透视表:
$organization->belongsToMany('User');
$user->belongsToMany('Organization');
我可以通过group_id查询数据透视表中的所有user_id,然后获得每个user_id的所有访问,但是哪种方法更有说服力呢?
一个用户有很多次访问,一次访问属于一个用户。访问不属于组织。
使用where()解决。基本上没有改变我目前的关系设置…为了获得累计视图,我这样做了:
$org = Organization::find($org_id);
return DB::table('visits')->whereIn('user_id', $org->users->modelKeys())->sum("views");
modelKeys()返回与该组织关联的所有用户id。然后我得到这些用户的所有视图的总和。
*注意,为了维护Eloquent关系,使用Organization::find而不是DB::table(' Organization ')也很重要。否则$organization->users将给出一个错误。
我想你可能想要一个这样的"有很多通过"的关系:
class Organization extends Model
{
public function visits()
{
return $this->hasManyThrough('AppVisit', 'AppUser');
}
}
那么你可以调用count()
Laravel 5.1 doc