php - Laravel (5.7) Eloquent 多对多,双方都有查询

标签 php laravel eloquent many-to-many relationship

假设我有一个用户、角色和一个数据透视表。我为角色和用户设置了belongsToMany。

用户模型:

<?php

namespace App;

...
use App\Models\Role;

class User extends Authenticatable
{
  ...
  public function roles()
  {
    return $this->belongsToMany(Role::class, "UserRoles", "userId", "roleId")
                ->withPivot("read", "write", "update", "delete")
                ->withTimestamps();
  }
}

榜样:

<?php

namespace App\Models;

...
use App\User;

class Role extends Model
{
  ...
  public function users()
  {
    return $this->belongsToMany(User::class, "UserRoles", "roleId", "userId")
                ->withPivot("read", "write", "update", "delete")         
                ->withTimestamps();
  }

}

表“用户”:

userId username
1      admin
2      johndoe
3      menghour

表“角色”:

roleId roleName
1      Admin
2      HR
3      Account

数据透视表“UserRoles”:

id     userId   roleId   read   write   update   delete
1      1        1        1      1       1        1
2      1        2        1      1       1        1
3      1        3        1      1       1        1
4      2        2        1      0       0        0
5      3        3        1      1       1        0

我的问题是如何在数据透视表中获取过滤器。

例如:我只想过滤 userIdroleId 或同时过滤 userId 和 roleId

如果我在 Blade 模板中选择user = admin,我想获取用户拥有的所有角色。 预期结果:

username    roleName

admin       Admin
admin       HR
admin       Account

如果我在 Blade 模板中选择选项role = HR,我想获取该角色拥有的所有用户。 预期结果:

username    roleName

admin       HR
johndoe     HR

如果我选择选项user = adminrole = HR,我只想获取特定的用户和角色。 预期结果:

username    roleName

admin       HR

我累了:

User::whereHas("roles", function ($query) use ($request) {
      if ($request->userId) {
        $query->where("userRoles.userId", "=", $request->userId);
      }
      if ($request->roleId) {
        $query->where("userRoles.roleId", "=", $request->roleId);
      }
    })->get();

注意:我使用的是 Laravel 5.7

最佳答案

您可以尝试此查询来根据您的示例过滤数据。

函数whereHas用于检索具有给定角色的所有用户。要获取用户的角色,您必须使用 with 函数。

$user = User::whereHas('roles', function ($query) use ($request) {
            if ($request->roleId) {
                $query->where("userRoles.roleId", "=", $request->roleId);
            }
        })
        // It will give you the user's role data.
        ->with('roles');

// It will check in users table if you have applied the filter by user.
if ($request->userId) {
    $user = $user->where("users.id", "=", $request->userId);
}

$user = $user->get();

您还可以尝试此查询来根据您的示例过滤数据。此查询将为您提供具有您在角色对象中指定的特定角色的用户。 例如:如果您在 Blade 模板中选择选项 role = HR。

$user = User::whereHas('roles', function ($query) use ($request) {
        if ($request->roleId) {
            $query->where("userRoles.roleId", "=", $request->roleId);
        }
    })
    // It will give you the user data with a particular given role which you has passed in the request.
    ->with(['roles' => function($query) use($request) {
        if ($request->roleId) {
            $query->where("roles.id", "=", $request->roleId);
        }
    }]);

// It will check in users table if you have applied the filter by user.
if ($request->userId) {
    $user = $user->where("users.id", "=", $request->userId);
}

$user = $user->get();

关于php - Laravel (5.7) Eloquent 多对多,双方都有查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53353182/

相关文章:

php - 如何 if else 显示其他内容 laravel

mongodb - 未找到类 'MongoDB\Driver\Manager'

mysql - 如何使用 laravel eloquent 从右边的 sql 中获取 5 个字符?

php - 如何隐藏 laravel 中的关系列?

php - Laravel 中 BelongsTo 和 HasOne 有什么区别

php - count() 在 laravel 中返​​回软删除项

javascript - 从下拉列表中搜索并建议关键字

php - 使用存储在属性中的类名

php - 在共享相同 wp_users 和 wp_usermeta 表的两个 Wordpress 安装之间同步所有用户角色。

php - Laravel 5 MethodNotAllowedHttpException 在 RouteCollection.php 行 201 :