php - Laravel 查询排除数据
问题描述
我有查询我在哪里获得具有某些角色的所有用户并且它工作正常,我现在需要的是排除那些已经保存在第三个表中的用户,只返回第三个表中没有行的用户。
逻辑
- 用户表 (
user has many roles
,user hasOne manager
) - 角色表 (
role belongsTo user
) - 经理表 (
managers belongsTo user
)
第一次
具有我角色的用户manager
将它们全部归还。(假设有 2 个用户)
我将其中一个保存在managers
表中。
第二次
具有我角色的用户manager
将它们全部归还。
我将其中一个保存在managers
表中。
问题
第二次我应该只获取1
用户,因为我之前将其中一个保存到managers
表中。但是使用我当前的代码,我仍然有 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"
任何想法?
解决方案
根据您的问题,我预测您具有以下数据库结构:
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'
推荐阅读
- visual-studio-code - 让 VSCode Intellisense 默认建议“if block”而不是“if”
- php - 如何将 SQL Server 与 PHP 7.3 连接起来?
- android - ConstraintLayout: EditText.requestFocus() is not working normally when it is added in Group
- powershell - 选择格式已损坏
- c# - 在 64 位中禁用 QuickEditMode
- cordova - 如何在没有 iFrame 的情况下在离子应用程序中显示网站?
- azure - Azure Databricks 上的 R 版本
- python - 如何从跨度列表中获取所有最大不重叠的跨度集
- java - 从 firebase 检索音频剪辑并使用 Google Cloud、Speech to text api。检索该剪辑的转录
- python - 如何在同一行python中获取输出