【问题标题】:Filtering pivot table data with Laravel models使用 Laravel 模型过滤数据透视表数据
【发布时间】:2014-01-12 15:17:32
【问题描述】:

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

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 数组进行后处理?

【问题讨论】:

标签: php laravel filtering eloquent pivot-table


【解决方案1】:

尝试以下方法:

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

【讨论】:

  • 谢谢,我会用这个解决方案。
  • 警告:我在 Laravel 7.x 中尝试过这个(虽然没有精确分析)并且这个查询还返回了不应该匹配列的用户!,这里有些奇怪:构造和执行的实际 SQL 查询由 laravel 结尾:“...其中 pivot_table.user_id 在 (1, 2, 3, 4, 5, 6, 7) 和 pivot_extra_column = 1" 所以它实际上返回了所有 7 个用户(我不知道为什么),即使是那些没有pivot_extra_column = 1 的。所以这很奇怪!也许是一个错误?
【解决方案2】:

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

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

然后使用类似的东西:

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

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

【讨论】:

  • 感谢您的回复。我喜欢你的解决方案,但是我使用的是 Laravel 4.0,所以我不能使用 wherePivot。
  • @user1544110 谢谢!对于 Laravel 4.0,您可以使用 where() 代替 wherePivot()
  • 但是如果你使用 where 而不是 wherePivot 那么查询会检查表角色是否有一个主要列?
猜你喜欢
  • 2016-02-12
  • 2017-09-30
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
相关资源
最近更新 更多