2016-01-12 8 views
0

У меня проблема, с которой я не сталкивался раньше, с Eager Loading в Laravel.Laravel 4.2 Eager Loading 4 таблицы

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

- Letter 
    id, 
    sentence_id 

- Sentence 
    id, 
    paragraph_id 

- Paragraph 
    id, 
    book_id 

- Book 
    id 

belongsTo/belongsToMany:

  • letter->belongsToMany('Sentence')
  • sentence->belongsTo('Paragraph')
  • paragraph->belongsTo('Book')

имеет/hasMany:

  • book->hasMany('Paragraph')
  • paragraph->hasMany('Sentence')
  • sentence->hasMany('Letter')

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

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

Я тогда подумал, что могу использовать Eager Loading С hasManyThrough что-то в действие.

public function sentences(){ 
    return $this->hasManyThrough('Sentence', 'Paragraph'); 
} 

Что я мог тогда сделать что-то вроде:

Book::sentences()->with(['letters' => function($q) use (&$letters){ 
    $letters = $q->get()->unique(); 
}]); 

Однако это не кажется правильно установить связь.

Каков наилучший способ доступа к D через A?

ответ

1

Чтобы загрузить letters отношения в Book вы должны сделать что-то подобное со стандартными соотношениями:

Отношения:

Book: 

paragraps -> hasMany 

Paragraph: 

sentences -> hasMany 

Sentence: 

letters -> hasMany 

Получение книги с буквами

$bookId = 1; // sample book id 
$book = Book::with('paragraphs.sentences.letters')->find($bookId); 

И теперь для отображения всех lett ERS вы могли бы использовать:

foreach ($book->paragraphs as $paragraph) { 
    foreach ($paragaph->sentences as $sentence) { 
     foreach ($sentence->letters as $letter) { 
      echo $letter->id; 
     } 
    }  
} 

Я не знаю, для чего вы используете эту структуру, но в зависимости от использования, может быть, вы также должны дублировать информацию, как-то в вашей базе данных. Например, для letters, возможно, вы также должны добавить столбец book_id, а затем вы можете получить все буквы книг, используя простые $book->letters, но все зависит от того, как вы используете свое приложение.

+0

Так вот как я теперь загрузил отношения, но я пытался получить все буквы, принадлежащие книге, через абзацы и предложения. Я делал цикл раньше и вдавался в массив, но это вызывает проблемы, потому что у меня также есть транслитерация этих букв в качестве другой таблицы, к которой я должен получить доступ. Это означало бы, что мне пришлось бы снова зацикливать буквы, а затем сделать «Letter :: with (« транслитерированный ») -> find ($ letter-> id);' получить каждый из них, что приведет к еще нескольким запросам, если Я не ошибаюсь? – Ohgodwhy

+0

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

+0

Итак, вы говорите, что модель 'letter' также должна иметь' public function books() {return $ this-> attribToMany ('book')} '? – Ohgodwhy

 Смежные вопросы

  • Нет связанных вопросов^_^