代码之家  ›  专栏  ›  技术社区  ›  mafortis

Laravel查询排除数据

  •  0
  • mafortis  · 技术社区  · 5 年前

    我有一个查询,在那里我得到了所有具有特定角色的用户,它工作得很好,我现在需要的是排除那些已经保存在第三个表中的用户,只返回第三个表格中没有行的用户。

    逻辑

    1. 用户表( user has many roles , user hasOne manager )
    2. 角色表( role belongsTo user )
    3. 经理表( managers belongsTo user )

    第一次

    具有角色的用户 manager 我将它们全部归还。(假设有2个用户)

    我救了其中一个 managers 桌子。

    第二次

    具有角色的用户 经理 我将它们全部归还。

    我救了其中一个 管理者 桌子。

    问题

    第二次我只能得到 1 用户,因为我之前将其中一个保存到 管理者 桌子。但用我目前的代码,我仍然有2个用户。

    代码

    $users = User::whereHas("roles", function($q) {
      $q->where("name", "manager");
    })->get();
    

    上述代码的SQL输出为:

    "select * from `users` where exists (select * from `roles` inner join `model_has_roles` on `roles`.`id` = `model_has_roles`.`role_id` where `users`.`id` = `model_has_roles`.`model_id` and `model_has_roles`.`model_type` = ? and `name` = ?) and `users`.`deleted_at` is null"
    

    知道吗?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Kristian A.BEN    5 年前

    根据你的问题,我预测你有这样的数据库结构:

    User
    user_id(PK) | ...
    
    Role
    role_id(PK) | user_id | name | ...
    
    Manager
    manager_id | user_id | ...
    

    因此,您需要查询所有角色为“manager”但不在表管理器中的用户。

    只需左键加入:

    $users = User::query()
      ->select("user.*")
      ->join("Role", "user.user_id", "=", "role.user_id")
      ->leftJoin("Manager", "manager.user_id", "=", "user.user_id")
      ->whereNull("manager.manager_id")
      ->where("role.name", "=", "manager")
      ->get();
    

    它将生成以下SQL查询:

    SELECT user.*
    FROM
      user
      INNER JOIN role ON role.user_id=user.user_id
      LEFT JOIN manager ON manager.user_id=user.user_id
    WHERE manager.manager_id IS NULL AND role.name='manager'
    
    推荐文章