У меня есть следующие таблицы:
lessons - lessonID - lessonName .. sections - sectionID - lessonID references lessons.lessonID .. exercises - exerciseID - sectionID references sections.sectionID ..
Я установил следующие отношения:
Урок:
public function sections() { return $this->hasMany('Section', 'lessonID'); }
Раздел:
public function lesson() { return $this->belongsTo('Lesson', 'lessonID'); } public function exercise() { return $this->hasOne('Exercise', 'sectionID'); }
Упражнение:
public function section() { return $this->belongsTo('Section', 'sectionID'); }
Теперь я хочу сказать, что у Уроки есть много упражнений через разделы, поэтому я попытался добавить
public function exercises() { return $this->hasManyThrough('Exercise', 'Section', 'lessonID', 'sectionID'); }
к модели Уроки, и я бегу
Lesson::with('sections', 'exercises')
дает мне пустой массив для упражнений. Как я могу выполнить то, что хочу?
Изменить: я посеял таблицу упражнений так:
<?php class ExerciseTableSeeder extends Seeder { public function run() { DB::table('exercises')->delete(); Exercise::create(array( 'exerciseID' => 1, 'sectionID' => 2, ... )); Exercise::create(array( 'exerciseID' => 2, 'sectionID' => 4, ... )); } } ?>
Изменить 2: Вот мои модели: http://laravel.io/bin/2Rdl
И вот журналы запросов: http://laravel.io/bin/vebK
Короче говоря: Урок и его разделы возвращаются в порядке, но я получаю пустой массив для упражнений.
После того, как я сообщил о проблеме в их Github , я получил довольно смущающе простой ответ: вместо этого запрос должен быть Lesson::with('sections.exercises')
.
Кажется прекрасным для меня, как вы его настроили сейчас, после помощи @ deczo. Probalby у вас просто нет связанной записи, что может быть причиной пустого массива
РЕДАКТИРОВАТЬ
Кажется, что функция hasManyThrough
не должна использоваться в этой ситуации.
Учитывая, что отношения установлены правильно (как вы подтверждаете в комментариях к этому ответу), ответ можно найти в документации . В нем четко говорится
Например, модель страны может иметь много сообщений через модель пользователей
Я считаю, что отношение, для которого hasManyThrough
предназначено для ONE-to-ONE + ONE-to-MANY. В вашем случае это ONE-to-MANY + ONE-ON-ONE, поэтому может не работать.
Я предлагаю вам сообщить об этом на странице github .
Здесь кроется проблема:
public function exercise() { return $this->hasOne('Exercise', 'Section'); }
должно быть:
public function exercise() { return $this->hasOne('Exercise', 'sectionID'); }
редактировать:
Неправильное отношение hasManyThrough. Это происходит так:
hasManyThrough('farModel', 'relatedModel', 'keyOnRelatedModel', 'keyOnFarModel')
так правильно:
public function exercises() { return $this->hasManyThrough('Exercise', 'Section', 'lessonID', 'sectionID'); }
edit: to @ clod986 note – hasManyThrough () работает одинаково для ONE-TO-MANY -> ONE-TO-ONE, если последнее имеет отношение hasOne (не принадлежит).