Laravel 4.2 急切加载 4 个表
Laravel 4.2 Eager Loading 4 tables
我遇到了一个以前在 Laravel.
中使用 Eager Loading 时从未遇到过的问题
我有以下table结构
- 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')
has/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();
}]);
然而,这似乎没有正确建立关系。
通过 A
访问 D
的最佳方式是什么?
要将 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
获取所有书信,但一切都取决于您如何使用您的应用程序。
我遇到了一个以前在 Laravel.
中使用 Eager Loading 时从未遇到过的问题我有以下table结构
- 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')
has/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();
}]);
然而,这似乎没有正确建立关系。
通过 A
访问 D
的最佳方式是什么?
要将 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
获取所有书信,但一切都取决于您如何使用您的应用程序。