使用where子句从laravel中的join查询获取数据

amrnrhlw  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(344)

我正在使用laravel和angularjs创建一个系统,在这里我将任务分配给用户。多个任务有多个用户,反之亦然。在数据库中,我有以下表:
任务:id |名称
任务用户:id |任务id |用户id
用户:id | name
在我的视图中,我使用任务表的id来显示特定的任务。我将显示未分配给特定任务的用户(称为未分配用户)列表。当该用户被分配时,其名称将从列表中删除。
为此,我使用以下查询:

public static function remainingUser($task_id)
    {
    return \DB::table('users')
        ->leftjoin('task_users', 'task_users.user_id', '=', 'users.id')
        ->select('users.id',
            'users.name as name'
        )
        ->where('task_id', '!=', $task_id)
        ->orWhere('task_id', null)
        ->get();
    }

假设我有这个数据
任务:
id |名称
1 |任务1
2 |任务2
3 |任务3
用户:
id |名称
1 |用户1
2 |用户2
3 |用户3
4 |用户4
5 |用户5
6 |用户6
7 |用户7
8 |用户8
9 |用户9
10 |用户10
任务用户:
id |任务id |用户id
1 | 1 | 1
1 | 1 | 2
1 | 1 | 3
1 | 1 | 5
1 | 1 | 6
1 | 1 | 7
1 | 2 | 2
1 | 2 | 4
现在假设我正在显示task_id=1的任务详细信息,并且我想将用户4分配给这个任务。因此,我的未分配用户列表应该包含所有未分配此任务的用户。我的查询没有返回所需的数据。我在where子句中也尝试了不同的条件,但没有得到正确的所需数据。我做错什么了?

czq61nw1

czq61nw11#

问题的存在是因为当您从 Users ,获得所有用户 left Joined 使用单个任务示例。所以如果 User1Task1 以及 Task2 ,仅限 Task1 会在这里匹配,因为它会匹配 User1 到了第一排 task_users . 为了列出未分配的用户,您的查询将如下所示:

public static function remainingUser($task_id)
{
return \DB::table('task_users')
    ->rightJoin('users', 'task_users.user_id', '=', 'users.id')
    ->select(
      \DB::raw("DISTINCT(`users`.`id`)"),
      'users.name as name'
    )
    ->where('task_id', '!=', $task_id)
    ->orWhere('task_id', null)
    ->get();
}

相关问题