Laravel left join приводит к неожиданным результатам при доступе к связанной модели - PullRequest
0 голосов
/ 27 ноября 2018

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

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

ТАБЛИЦА: студенты

ИД
1 Боб
2 Клэр
3 Джим
4 Мэри

ОТНОШЕНИЯ (И)

hasMany ('App \ Score') hasMany ('App \ Guardian')

ТАБЛИЦА: хранители

id имя_ студента
1 1 папа боба
2 1 папа мамы
3 3 jims мама
4 4 Мэрис мама
5 4 Мэрис папа

ОТНОШЕНИЯ (ей)

принадлежат ('App \ Student')

ТАБЛИЦА: баллы

идентификатор студента_ид балла
1 3 75
2 4 100

ОТНОШЕНИЯ (и)

ownTo ('App \ Student')

Цикл по всем ученикам в режиме лезвия и вывод соответствующих опекунов работает как положено.

$students = \App\Student::orderBy('students.name')->get();

without join

Однако, когда я добавляюлевые присоединяются к таблице очков.Выступил против первой записи, которая имеет связанную запись в таблице результатов, и они всегда являются первым набором опекунов в таблице (т. е. Боба).

$studentsleftjoin = \App\Student::leftJoin('scores', function($join) {
        $join->on('students.id', '=', "scores.student_id");
    })
    ->orderBy('students.name')
    ->get();

with left join

Я бы ожидал того же результата независимо от левого соединения.

Пожалуйста, помогите мне понять, что я делаю неправильно.

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

Заранее большое спасибо за любую помощь.
Нев.

[ОБНОВЛЕНИЕ: Добавлениепосмотреть код согласно запросу]

<h2>Without join</h2>
 @foreach($students as $student)
  <strong>{{$student->name}} - Guardians: </strong> <ul>
   @foreach($student->guardians as $guardian)
   <li>{{$guardian['name']}}</li>
   @endforeach
 </ul>
 @endforeach


<h2>With left join</h2>
 @foreach($studentsleftjoin as $studentleftjoin)
  <strong>{{$studentleftjoin->name}} - Guardians:</strong> <ul>
   @foreach($studentleftjoin->guardians as $guardianleftjoin)
   <li>{{$guardianleftjoin['name']}}</li>
    @endforeach
   </ul>
 @endforeach

1 Ответ

0 голосов
/ 27 ноября 2018

Ваше левое объединение приводит только к scores табличным данным, поэтому вам нужно указать группировку в вашем eloquent.

Добавить group_by

$studentsleftjoin = \App\Student::leftJoin('scores', function($join) {
    $join->on('students.id', '=', "scores.student_id");
})
->orderBy('students.name')
->groupBy('students.id')
->get();
...