提问者:小点点

基于相关模型属性的Laravel滤波器


我有两个模型用户和任务,它们之间具有多对多的关系,任务具有自嵌套关系,

现在我想让用户谁是当前自由的,即没有任务分配或分配的任务有状态,要么完成或关闭,下面是我写的代码和toSql的,但我仍然得到用户的任务与其他状态,如正在进行和未审查

$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

共1个答案

匿名用户

为什么不换一种方式。。。。

帮我把没有未完成任务的员工叫来。。。

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