У меня проблема, с которой я не сталкивался раньше, с 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
?
Так вот как я теперь загрузил отношения, но я пытался получить все буквы, принадлежащие книге, через абзацы и предложения. Я делал цикл раньше и вдавался в массив, но это вызывает проблемы, потому что у меня также есть транслитерация этих букв в качестве другой таблицы, к которой я должен получить доступ. Это означало бы, что мне пришлось бы снова зацикливать буквы, а затем сделать «Letter :: with (« транслитерированный ») -> find ($ letter-> id);' получить каждый из них, что приведет к еще нескольким запросам, если Я не ошибаюсь? – Ohgodwhy
Да, возможно, так, как я уже сказал, вы могли бы рассмотреть вопрос о назначении писем и книг для упрощения поддержания таких отношений. –
Итак, вы говорите, что модель 'letter' также должна иметь' public function books() {return $ this-> attribToMany ('book')} '? – Ohgodwhy