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

Posted

技术标签:

【中文标题】使用 Laravel 模型过滤数据透视表数据【英文标题】:Filtering pivot table data with Laravel models 【发布时间】: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 数组进行后处理?

【问题讨论】:

您是在查询一个用户的角色还是多个用户的角色? 重复:***.com/questions/18538527/… 【参考方案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 那么查询会检查表角色是否有一个主要列?

以上是关于使用 Laravel 模型过滤数据透视表数据的主要内容,如果未能解决你的问题,请参考以下文章

laravel 使用 in 子句模型名称连接多态数据透视表

Lumen/Laravel Eloquent - 按数据透视表中的属性过滤

同步数据透视表 - VBA 代码不起作用

如何通过laravel创建数据透视表

Laravel 数据透视表 id 列

Excle数据透透视表如何删除数据透视表