Laravel: запрос о том, где пункт не так - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь добиться того, чтобы учителя могли импортировать ученика в разные классы.

Примечание. Ученик может иметь несколько классов.

Проблема в том, что когда я показываю список учеников в выпадающем списке, он должен возвращать всех учеников, кроме учеников, не входящих в этот класс (классом является страница, на которой я нахожусь, app.com/классы / 5, например).

$students = User::join('group_user', 'users.id', '=', 'group_user.user_id')
                ->role('student')
                ->where('group_user.group_id', '!=', $id)
                ->orderBy('users.name', 'asc')
                ->get();

Это работает и показывает всех учеников, которые не находятся в этом конкретном классе НО , если ученик, который находится в этом классе и другом классе, его имя появляется всписок и как дубликаты имен.

Что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Когда в MySQL включен режим only_full_group_by, это означает, что строгие правила ANSI SQL будут применяться при использовании GROUP BY

. Вы должны попытаться выбрать из схемы поля, к которым вы можете применить группу, а не выбирать *.

$students = User::join('group_user', 'users.id', '=', 'group_user.user_id')
            ->role('student')
            ->where('group_user.group_id', '!=', $id)
            ->select('users.id', 'other fields you used')
            ->orderBy('users.name', 'ASC')
            ->groupBy('users.id')
            ->get();

Not IN также полезно в вашем случае

User::select('fields you used')
    ->role('student')
    ->whereNotIn('id', DB::table('group_user')->where('group_id', $id)->pluck('user_id')) // $id = 5
    ->orderBy('name', 'ASC')
    ->get();
0 голосов
/ 05 февраля 2019

Измените ваш запрос, чтобы использовать distinct(), например, так:

    $students = User::join('group_user', 'users.id', '=', 'group_user.user_id')
                ->role('student')
                ->where('group_user.group_id', '!=', $id)
                ->orderBy('users.name', 'ASC')
                ->distinct()
                ->get();

Вы также можете groupBy('users.id')

    $students = User::join('group_user', 'users.id', '=', 'group_user.user_id')
                ->role('student')
                ->where('group_user.group_id', '!=', $id)
                ->orderBy('users.name', 'ASC')
                ->groupBy('users.id')
                ->get();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...