Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

wizjo's avatar
Level 26

doesntHave with orWhere in query

I need to build query in which I will get projects with tasks that:

(current user belongs to project && project has tasks that are assigned to current user) or (project has tasks that are not assigned to anyone).

I stuck with this query:

            $projects = Project
                ::with('tasks.status', 'tasks.users')
                // this should be first condition where(
                ->whereHas('users', function ($query) use ($currentUser) {
                    $query->where('users.id', '=', $currentUser->id);
                })
                ->whereHas('tasks.users', function ($query) use ($currentUser) {
                    $query->where('id', '=', $currentUser->id);
                })
                // ) end first where
                ->doesntHave('tasks.users') //this should be wrap into orWhere
                ->get();  
0 likes
2 replies
wizjo's avatar
Level 26

Perfect! That`s it.

For future reference. This is complete query:

            $projects = Project
                ::with('tasks.status', 'tasks.users')
                ->where(function ($query) use ($currentUser) {
                    $query->whereHas('users', function ($query) use ($currentUser) {
                        $query->where('users.id', '=', $currentUser->id);
                    })
                    ->whereHas('tasks.users', function ($query) use ($currentUser) {
                        $query->where('id', '=', $currentUser->id);
                    });
                })
                ->orDoesntHave('tasks.users')
                ->get(); 

Please or to participate in this conversation.