【问题标题】:Laravel many to many relationships - retrieving modelsLaravel 多对多关系 - 检索模型
【发布时间】: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();

【问题讨论】:

    标签: php mysql laravel relationship


    【解决方案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 关系或与商店相关的迁移有问题。
      猜你喜欢
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 2019-08-17
      • 2017-01-17
      • 1970-01-01
      • 2017-05-23
      • 2023-03-12
      • 2018-12-12
      相关资源
      最近更新 更多