Laravel 多对多关系 - 检索模型

Posted

技术标签:

【中文标题】Laravel 多对多关系 - 检索模型【英文标题】:Laravel many to many relationships - retrieving models 【发布时间】:2017-05-25 00:24:42 【问题描述】:

如果我们有这样的事情:

用户

身份证 姓名

角色

身份证 姓名

商店

身份证 姓名

role_user

role_id user_id

shop_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。现在修好了。确保您已正确定义 rolesshops 关系。 请解释否决票。 OP 的目标是we want all USER from SHOP 1 with ROLE admin。这正是代码的作用。 反对票不是来自我。但这不起作用:完整性约束违规:1052 列 'id' in where 子句不明确。 @baker 请发布适当的迁移和关系。如果 devk 的回答对您有用,这意味着 users 关系可以正常工作,但 shops 关系或与商店相关的迁移有问题。

以上是关于Laravel 多对多关系 - 检索模型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中检索链接到多对多关系的模型?

从laravel中的多对多关系中获取单列

从父多对多关系获取所有子模型 Laravel Eloquent

Laravel 计数和检索多对多关系

Laravel5.1 模型 --多对多关系

Laravel 8 多对多关系不起作用(没有抛出错误)