используйте условия where для получения данных из запроса на соединение в Laravel - PullRequest
0 голосов
/ 02 октября 2018

Я создаю систему, используя Laravel и AngularJS, где я назначаю задачи пользователям.Несколько задач имеет несколько пользователей и наоборот.В базе данных у меня есть эти таблицы:

task: id |имя

task_users: id |Task_id |user_id

users: id |name

На мой взгляд, я отображаю конкретную задачу, используя идентификатор таблицы задач.Я отображаю список пользователей (называемых неназначенными пользователями), которые не назначены для этой конкретной задачиКогда этот пользователь назначен, его имя удаляется из списка.

Чтобы добиться этого, я использовал этот запрос:

    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();
    }

Предположим, у меня есть эти данные

task:

id |имя

1 |Задача1

2 |Задача2

3 |Task3

пользователи:

id |имя

1 |Пользователь1

2 |Пользователь2

3 |Пользователь3

4 |Пользователь4

5 |Пользователь5

6 |Пользователь6

7 |Пользователь7

8 |Пользователь8

9 |Пользователь9

10 |User10

task_users:

id |Task_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, но я не получаю правильные необходимые данные.Что я делаю не так?

1 Ответ

0 голосов
/ 02 октября 2018

Проблема существует, потому что при выборе значения Users все пользователи left Joined получают один экземпляр задач.Так что если User1 имеет Task1 и Task2, то здесь будет сопоставлено только Task1, поскольку оно будет соответствовать User1 1-й строке, найденной для него в пределах 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();
}
...