2016-02-19 185 views
1

我有以下的口才。Laravel很多層的雄辯關係

卷, 問題, 類別, 條, ArticleTranslation,

卷可以有很多的問題。 問題可以有很多類別。 類別可以有很多文章。 文章可以有很多翻譯。

那麼如何從文章/ ArticleTranslation中獲取卷?

+0

4水平會導致性能下降和大量不必要的開銷。考慮**反規範化**你的表。 – Mysteryos

+0

@Mysteryos感謝您的建議,我去反規範化的表。 – Indra

回答

1

首先你的模型。

.. 
class Volume extends Model { 
    public function issues() { 
    return $this->hasMany(Issue::class); 
    } 
} 

class Issue extends Model { 
    public function volume() { 
    return $this->belongsTo(Volume::class); 
    } 
    public function categories() { 
    return $this->hasMany(Category::class); 
    } 
} 

class Category extends Model { 
    public function issue() { 
    return $this->belongsTo(Issue::class); 
    } 
    public function articles() { 
    return $this->hasMany(Article::class); 
    } 
    public function articlesTranslated() { 
    return $this->hasMany(ArticleTranslated::class); 
    } 
} 

class Article extends Model { 
    public function category() { 
    return $this->belongsTo(Category::class); 
    } 
} 
.. 

然後在你的代碼:在數據庫

.. 
$articles = Articles::all(); 
$volumes = []; 
foreach ($articles as $article) { 
    $volumes[] = $article->category->issue->volume; 
} 
.. 

Docs

+0

某些'eager-loading'會幫助查詢的性能。 '文章:: with('category.issue.volume') - > get()' – Mysteryos

+0

@Damain您的解決方案將導致N + 1問題。對於每個循環,將執行一個新的查詢,這將導致一個很大的性能問題。改爲使用熱切加載。 – oseintow