Intereting Posts
Преобразование curl-команды в php curl Определите PHP-функцию в XSL и вызовите ее. Возможное? Как? Laravel 4 ajax с частичными видами аргументы конструктора pass using PDO :: FETCH_CLASSTYPE PHPUnit: как мне высмеять несколько вызовов методов с несколькими аргументами? загрузите большой файл размером от 1 до 2 ГБ с помощью загрузки файла jQuery – blueimp (основанный на Ajax) php / yii, который показывает ошибку в браузере Firefox SimpleXML цикл работает, но прерывается на полпути как добавить динамический активный класс на выбранную страницу Могу ли я поймать сообщения exit () и die ()? Обрабатывать арабскую строку в PHP с помощью Eclipse Пакет Отправить письмо с SwiftMailer cURL занимает много времени, чтобы начать загрузку Регулярные выражения PCRE с использованием подпрограмм named pattern Драйвер файлов CI_Session (ошибка PHP) Использование протокольных относительных URI в заголовках «Местоположение:»

Laravel Eloquent: Как я могу определить эти отношения?

У меня есть следующие таблицы:

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

Короче говоря: Урок и его разделы возвращаются в порядке, но я получаю пустой массив для упражнений.

Related of "Laravel Eloquent: Как я могу определить эти отношения?"

После того, как я сообщил о проблеме в их 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 (не принадлежит).