使用 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 模型过滤数据透视表数据的主要内容,如果未能解决你的问题,请参考以下文章