【问题标题】:Laravel 4.2 Eager Loading 4 tablesLaravel 4.2 急切加载 4 个表
【发布时间】:2016-01-12 21:56:42
【问题描述】:

我遇到了一个以前在 Laravel 中使用 Eager Loading 时从未遇到过的问题。

我有如下表结构

- 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 LoadinghasManyThrough 来达到以下效果。

public function sentences(){
    return $this->hasManyThrough('Sentence', 'Paragraph');
}

然后我可以这样做:

Book::sentences()->with(['letters' => function($q) use (&$letters){
    $letters = $q->get()->unique();
}]);

但是这似乎并没有正确建立关系。

通过A 访问D 的最佳方式是什么?

【问题讨论】:

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


    【解决方案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 获取所有书信,但这一切都取决于您如何使用您的应用程序。

    【讨论】:

    • 这就是我现在加载关系的方式,但我试图通过段落和句子获取属于一本书的所有字母。我之前正在执行循环并推入一个数组,但这会导致问题,因为我还将这些字母的音译作为我需要访问的另一个表。这意味着我将不得不再次循环字母,然后执行Letter::with('transliterated')->find($letter->id); 来获取每个字母,如果我没有错的话,这将导致更多的查询?
    • 是的,所以可能正如我所说,您可以考虑将字母也分配给书籍,以便更轻松地维持这种关系
    • 所以你是说letters 模型也应该有一个public function books(){ return $this->belongsToMany('book') }
    • 查看当前表格,应该是book() {return $this->belongsTo('book); },因为此时字母属于句子,所以它也属于书,但也许你以错误的方式创建了它,它真的应该是多对的- 多关系
    • 明白。也许就是这样。感谢您的建议。
    猜你喜欢
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多