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:

has/hasMany:

这一切都很好。但是,如果我想得到书中的所有字母,我似乎无法找到正确的方法。

我试过 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 获取所有书信,但一切都取决于您如何使用您的应用程序。