Laravel多对多关系 - 检索模型

3
如果我们有这样的内容:

用户

  • id
  • name(名称)

角色

  • id
  • name(名称)

商店

  • id
  • name(名称)

角色用户

  • 角色id
  • 用户id

商店用户

  • 商店id
  • 用户id

速查:商店---商店用户---用户---角色用户---角色

我们想要从商店1中找到所有具有“管理员”角色的用户。该怎么做呢?

从商店1中找到所有用户:

$shop = Shop::find( $shopId );
$shop->users()->get();

类似这样的内容会很好:

$shop = Shop::find( $shopId );
$shop->users()->roles->()->where( 'name', 'Admin' )->get();
2个回答

3
假设您的关系设置正常,这应该会得到您想要的结果:
$shop = Shop::with(['users' => function ($q) {
    $q->whereHas('roles', function ($q) {
        $q->where('name', 'Admin');
    });
}])->find($shopId);

这将选择具有id = $shopId的商店,并将所有roleroles.name = Adminusers附加到它。

您可以像这样获取用户:$users = $shop->users


-1

使用 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
@baker 我忘记在第二个 whereHas() 中将 roles 改为 shops 了。现已修复,请确保正确定义了 rolesshops 的关系。 - Alexey Mezenin
这个 downvote 不是我点的。但是这段代码有问题:完整性约束冲突:1052,where 子句中的列'id'不明确。 - baker
@baker请发布适当的迁移和关系。如果devk的答案对您有效,这意味着“users”关系正常,但“shops”关系或相关迁移存在问题。 - Alexey Mezenin
用户: belongsToMany(Role::class) 和 belongsToMany(Shop::class) 商店: belongsToMany(User::class) 角色: belongsToMany(User::class) - baker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接