Laravel 4.2 Eager正在加载4个表

时间:2016-01-12 21:56:43

标签: php laravel laravel-4 eloquent eager-loading

我有一个问题,我之前没有遇到过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的最佳方法是什么?

1 个答案:

答案 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获取所有书籍信件,但一切都取决于您使用应用程序的方式。