我有一个问题,我之前没有遇到过Laravel中的Eager Loading。
我有以下表结构
- Letter
id,
sentence_id
- Sentence
id,
paragraph_id
- Paragraph
id,
book_id
- Book
id
属于关联/ belongsToMany:
letter->belongsToMany('Sentence')
sentence->belongsTo('Paragraph')
paragraph->belongsTo('Book')
有/的hasMany:
book->hasMany('Paragraph')
paragraph->hasMany('Sentence')
sentence->hasMany('Letter')
这一切都很棒。但是,如果我想获得书中的所有字母,我似乎无法找到正确的方法来做到这一点。
我已经尝试hasManyThrough
但很快意识到这不符合我想要实现的目的。
然后我认为我可以使用Eager Loading
WITH hasManyThrough
来实现效果。
public function sentences(){
return $this->hasManyThrough('Sentence', 'Paragraph');
}
然后我可以做以下事情:
Book::sentences()->with(['letters' => function($q) use (&$letters){
$letters = $q->get()->unique();
}]);
然而,这似乎并未正确建立关系。
通过D
访问A
的最佳方法是什么?
答案 0 :(得分: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);
现在显示您可以使用的所有字母:
foreach ($book->paragraphs as $paragraph) {
foreach ($paragaph->sentences as $sentence) {
foreach ($sentence->letters as $letter) {
echo $letter->id;
}
}
}
我不知道你使用这种结构是什么,但根据使用情况,也许你应该在数据库中复制某种方式的信息。例如,对于letters
,您也可以添加book_id
列,然后您可以使用简单$book->letters
获取所有书籍信件,但一切都取决于您使用应用程序的方式。