使用预先加载

时间:2018-01-30 09:53:58

标签: php laravel laravel-5 laravel-5.5

我希望根据类别获得特定文章的所有相关文章。

我有ArticleCategory

之间的关系

Article.php

public function category(){

    return $this->belongsTo(ArticleCategory::class,'category_id','id');

}

ArticleCategory.php

 public function articles(){

    return $this->hasMany(Article::class,'category_id','id');

}

ArticleController.php

public function singleArticle(Article $article){

    //I want to convert this statement to eager loading statement

    $relatedArticles = $article->category->articles;

    return view('pages/article',compact('article','relatedArticles'));

}

2 个答案:

答案 0 :(得分:2)

如果您想获得相关文章,也可以使用whereHas()

$relatedArticles = Article::whereHas('category', function($q) use($article) {
    $q->where('id', $article->category_id);
})
->get();

如果您想将所有内容加载到一个集合中:

$relatedArticles = Article::with(['category.articles' => function($q) use($article) {
    $q->where('id', $article->category_id);
}])
->get();

答案 1 :(得分:1)

如果您希望类别模型始终急于加载其文章,您可以添加

protected $with = ['articles'];

到Category.php文件。

然后你可以使用$ article-> category

这也适用于函数调用中的隐式绑定,因此当您在Article.php中写入时,您可以为每篇文章急切加载类别

protected $with = ['category'];

可悲的是,如果你想用

加载所有东西
protected $with = ['category.articles'];
在这种情况下,你会得到一个无限循环。仅仅为了将来类似案例的信息,您可以使用此方法进行嵌套的预先加载。