Laravel 5.4中如何通过关联分类筛选对应文章?
问题原因
你代码的核心问题是whereHas方法传入的关联名称和你在Post模型里定义的关联方法名不一致。
你在Post模型中定义的多对多关联方法名为getCategory,但whereHas方法需要传入和模型中定义完全一致的关联方法名,你代码里传的是category,关联匹配失败所以筛选条件不生效。
解决方案
方案1:直接修正whereHas的关联名称
把筛选代码里的关联名替换成你定义的getCategory即可,代码如下:
$categoryId = [1,2]; $data = Post::with('getCategory')->whereHas('getCategory', function ($query) use ($categoryId) { $query->whereIn('id', $categoryId); })->orderBy('id','DESC')->get();
方案2:规范关联方法命名(推荐)
Laravel关联方法通常不用加get前缀,且多对多关联对应多条数据,建议用复数命名,后续调用更易读:
- 修改
Post.php的关联定义:
public function categories() { return $this->belongsToMany(Category::class, 'post_category'); }
- 控制器代码对应调整关联名:
$categoryId = [1,2]; $data = Post::with('categories')->whereHas('categories', function ($query) use ($categoryId) { $query->whereIn('id', $categoryId); })->orderBy('id','DESC')->get();
可选补充:过滤预加载返回的分类
如果你需要返回的文章关联分类只保留你筛选的ID(而不是返回该文章的所有分类),可以给with也加筛选条件:
$categoryId = [1,2]; $filter = function ($query) use ($categoryId) { $query->whereIn('id', $categoryId); }; $data = Post::with(['categories' => $filter])->whereHas('categories', $filter)->orderBy('id','DESC')->get();
内容的提问来源于stack exchange,提问作者sawyer
相关产品推荐
相关产品推荐

