首页 > 解决方案 > 基于相关模型属性的 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

标签: phpmysqlsqllaravelrelational-database

解决方案


为什么不以另一种方式来做......

在他们没有未完成的任务时给我找员工...

$freeEmployees = User::where('role', 'employee')->whereDoesntHave('tasks', function ($q) {
               $q1->where('status', config('taskstatus.running'))
                   ->orWhere('status', config('taskstatus.uncompleted'));
           });
       })->get()->take($limit);

推荐阅读