2016-02-19 66 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