php - 基于相关模型属性的 Laravel 过滤器
问题描述
我有两个模型用户和任务,它们之间存在多对多关系,任务与自身作为父子关系具有自嵌套关系,
现在我想要获取当前空闲的用户,即没有分配任务或分配的任务的状态为已完成或已关闭,下面是我编写的代码和 toSql,但我仍然让用户具有其他状态的任务,例如 in-进展和审查不足
$freeEmployees = User::where('role', 'employee')->where(function ($q) {
$q->doesntHave('task')
->orWhereHas('task', function ($q1) {
$q1->where('status', config('taskstatus.completed'))
->orWhere('status', config('taskstatus.closed'));
});
})->get()->take($limit);
SELECT
*
FROM
`users`
WHERE
`role` = 'employee' AND(
NOT EXISTS(
SELECT
*
FROM
`task_checklist`
INNER JOIN `user_task` ON `task_checklist`.`id` = `user_task`.`task_id`
WHERE
`users`.`id` = `user_task`.`user_id` AND `task_checklist`.`archived_at` IS NULL
) OR EXISTS(
SELECT
*
FROM
`task_checklist`
INNER JOIN `user_task` ON `task_checklist`.`id` = `user_task`.`task_id`
WHERE
`users`.`id` = `user_task`.`user_id`
AND(
`status` = 'Completed' OR `status` = 'Closed')
AND `task_checklist`.`archived_at` IS NULL
)
)
ORDER BY
`updated_at`
DESC
解决方案
为什么不以另一种方式来做......
在他们没有未完成的任务时给我找员工...
$freeEmployees = User::where('role', 'employee')->whereDoesntHave('tasks', function ($q) {
$q1->where('status', config('taskstatus.running'))
->orWhere('status', config('taskstatus.uncompleted'));
});
})->get()->take($limit);
推荐阅读
- wpf - 如何将 ARGB 值绑定到组合框项中的矩形填充属性?
- ruby-on-rails - 控制器将 current_user 电子邮件添加到 Rails 中的数据库
- java - 构造函数点 newInstance 是否使用反射?
- mysql - 如何在不更改“sql_mode=only_full_group_by”的情况下使此查询与 MySQL 5.7 兼容?
- arrays - 如何检查地图是否存在于特定位置的数组中
- javascript - 输入类型号为运算符(+,-)上的事件输入返回 null
- r - 按最大日期划分的重复值的子集数据框
- database - 第一次在 python 中对大型 SQLite DB 执行查询需要很长时间
- swift - Couchbase 接收 Channel null
- spring-boot - Spring Boot 缓存批量和单独访问