Laravel 5.4如何获取与类别相关的文章

时间:2018-07-02 21:10:50

标签: php laravel laravel-5 eloquent

我正在Laravel 5.4中构建一个简单的商店目录。基本上,我想要的是在文章上添加一个按钮,以获取所有具有相关类别的文章(请注意,文章可以具有多个类别)。

我有我的文章和类别模型,以及一个article_category数据透视表。两者彼此之间有很多关系,例如:

文章模型中的代码:

public function categories()
{
    return $this->belongsToMany('App\Category');
}

类别模型的代码:

public function articles()
{
    return $this->belongsToMany('App\Article');
}

我的问题是如何获取包含与文章相关类别的所有文章的文章列表。

这是我现在在控制器上的函数,它接收带有类别列表的JSON对象:

public function showRelatedArticles($category) 
{
    // Decode JSON to PHP array
    $category = json_decode($category);
    $collection;
    if(is_array($category)){
        foreach ($category as $cat) {
            $articles = Article::whereHas('Category', function ($query) {
                $query->where('category_id', $cat->id);
            })->get();
            $collection = merge($articles);
        }
    } else {
        dd('Not array');
    }

    return view('front', ['articles' => $collection]);
}

这将返回错误:

  

BadMethodCallException
  调用未定义的方法Illuminate \ Database \ Query \ Builder :: Category()

我的模型之间的关系类型可能不正确,但这是声明多对多关系的正确方法,不是吗?

1 个答案:

答案 0 :(得分:1)

您可以将整个部分重写为此:

if (is_array($category)){
    $category_ids = collect($category)->pluck('id');

    $articles = Article::whereHas('categories', function($query) use ($category_ids) {
        // Assuming your category table has a column id
        $query->whereIn('categories.id', $category_ids);
    })->get();
} else {
    dd('Not array');
}

请注意小写的categories,这是Article类中的函数名称。

这将查询中的in与数组的collect结合在一起,并且仅检索链接到给定类别的文章。