使用Laravel模型过滤数据透视表数据

时间:2013-12-24 11:11:35

标签: php laravel filtering eloquent pivot-table

假设我有三张桌子(这只是一个例子):

users
   user_id
   username

roles
   role_id
   name

user_roles
    user_id
    role_id
    primary (boolean)

相应的laravel模型:

   class User extends Eloquent {
        public function roles() {
              return $this->belongsToMany('Role')->withPivot('primary');
        }
   }
   class Role extends Eloquent {
         public function users() {
              return $this->belongsToMany('User')->withPivot('primary');
         }
   }

我想获得所有用户的列表,但只返回返回对象中的主要角色。 如果我使用类似的东西:

$users = User::with('roles')->find(1);

每个用户对象都将包含与其对应的所有角色的列表。我希望此列表仅包含主要角色。有没有办法从查询中执行此操作,而无需后处理$ users数组?

2 个答案:

答案 0 :(得分:14)

我建议您在User模型中创建一个额外的方法,如下所示:

public function primaryRoles() {
    return $this->roles()->wherePivot('primary', true);
}

然后使用类似的东西:

$users = User::with('primaryRoles')->find(1);

另外,the documentation中的“Eager Load Constraints”部分可能是相关的。

答案 1 :(得分:10)

尝试以下方法:

$users = User::with(array('roles' => function($query)
{
    $query->where('primary', 1); 
}))->find(1);