【问题标题】:use where clauses to get data from join query in Laravel在 Laravel 中使用 where 子句从连接查询中获取数据
【发布时间】:2019-03-07 21:11:55
【问题描述】:

我正在使用 Laravel 和 AngularJS 创建一个系统,我将任务分配给用户。多个任务有多个用户,反之亦然。在数据库中,我有这个表:

任务: 编号 |名字

task_users: 编号 |任务ID | user_id

用户: 编号 |名字

在我看来,我使用任务表的 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();
    }

假设我有这些数据

任务:

标识 |名字

1 |任务1

2 |任务2

3 |任务3

用户:

标识 |名字

1 |用户1

2 |用户2

3 |用户3

4 |用户4

5 |用户5

6 |用户6

7 |用户7

8 |用户8

9 |用户9

10 |用户10

task_users:

标识 |任务ID | user_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 子句中尝试了不同的条件,但我没有得到正确的所需数据。我做错了什么?

【问题讨论】:

  • 检查this问题/答案。如果你有很好的模型、表格和关系,那就是答案。

标签: mysql database laravel where-clause


【解决方案1】:

之所以存在问题,是因为当您从 Users 中选择时,您会使用单个任务实例获得所有用户 left Joined。因此,如果User1 具有Task1Task2,则此处仅匹配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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 2020-11-05
    • 2018-03-27
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多