Laravel 多对多关系 - 检索模型
Posted
技术标签:
【中文标题】Laravel 多对多关系 - 检索模型【英文标题】:Laravel many to many relationships - retrieving models 【发布时间】:2017-05-25 00:24:42 【问题描述】:如果我们有这样的事情:
用户
身份证 姓名角色
身份证 姓名商店
身份证 姓名role_user
role_id user_idshop_user
shop_id user_id快速:shop---shop_user---user---role_user---role
我们希望来自 SHOP 1 的所有用户都拥有 ROLE 管理员。我们该怎么做?
来自 SHOP 1 的所有用户:
$shop = Shop::find( $shopId );
$shop->users()->get();
这样的东西会很好:
$shop = Shop::find( $shopId );
$shop->users()->roles->()->where( 'name', 'Admin' )->get();
【问题讨论】:
【参考方案1】:假设您的关系按预期工作,这应该会得到您想要的结果:
$shop = Shop::with(['users' => function ($q)
$q->whereHas('roles', function ($q)
$q->where('name', 'Admin');
);
])->find($shopId);
它将选择带有id = $shopId
的商店,并将所有users
附加到它,其中role
其中roles.name = Admin
你得到这样的用户$users = $shop->users
【讨论】:
【参考方案2】:使用whereHas()
方法:
$users = User::whereHas('roles', function($q) use($roleId)
$q->where('id', $roleId)
)->whereHas('shops', function($q) use($shopId)
$q->where('id', $shopId)
)->get();
【讨论】:
这不起作用 $users = User::whereHas( 'roles', function ( $q ) use ( $roleId ) $q->where( 'id', $roleId ); )->get(); SQLSTATE [23000]:违反完整性约束:1052 where 子句中的列 'id' 不明确。这确实有效 $users = User::whereHas( 'roles', function ( $q ) use ( $roleName ) $q->where( 'name', $roleName ); )->get();跨度> @baker 我忘了在第二个whereHas()
中将roles
更改为shops
。现在修好了。确保您已正确定义 roles
和 shops
关系。
请解释否决票。 OP 的目标是we want all USER from SHOP 1 with ROLE admin
。这正是代码的作用。
反对票不是来自我。但这不起作用:完整性约束违规:1052 列 'id' in where 子句不明确。
@baker 请发布适当的迁移和关系。如果 devk 的回答对您有用,这意味着 users
关系可以正常工作,但 shops
关系或与商店相关的迁移有问题。以上是关于Laravel 多对多关系 - 检索模型的主要内容,如果未能解决你的问题,请参考以下文章