Я пытаюсь понять некоторое наблюдаемое поведение, которое не имеет смысла для меня.
Я настроил некоторые придуманные таблицы и данные, как показано ниже, исключительно для демонстрации поведения.
ТАБЛИЦА: студенты
ИД
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();
Однако, когда я добавляюлевые присоединяются к таблице очков.Выступил против первой записи, которая имеет связанную запись в таблице результатов, и они всегда являются первым набором опекунов в таблице (т. е. Боба).
$studentsleftjoin = \App\Student::leftJoin('scores', function($join) {
$join->on('students.id', '=', "scores.student_id");
})
->orderBy('students.name')
->get();
Я бы ожидал того же результата независимо от левого соединения.
Пожалуйста, помогите мне понять, что я делаю неправильно.
Пожалуйста, прости меня, если мое объяснение не ясно.Я создал репозиторий 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