我正在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()
我的模型之间的关系类型可能不正确,但这是声明多对多关系的正确方法,不是吗?
答案 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
结合在一起,并且仅检索链接到给定类别的文章。