Laravel 5.5:如何查询关联多个分类的博客数据
解决Laravel多对多关联中查询多个分类关联博客的问题
首先得说清楚你报错的核心原因:当你用App\Category::find(1)时,拿到的是单个Category模型实例,所以能直接调用你定义的blog关联方法;但如果要查询ID为1和2的分类,你大概率用了类似App\Category::whereIn('id', [1,2])->get()或者App\Category::find([1,2])的写法,这时候返回的是Eloquent集合(Collection),集合实例上并没有blog这个属性,自然就会抛出你遇到的错误。
下面给你两种可行的解决思路:
思路一:先加载分类的关联博客,再提取合并
这种方式先获取目标分类,同时预加载它们关联的博客,然后把所有博客提取出来并去重(避免同一篇博客属于多个分类时重复出现):
// 预加载关联的博客,查询ID为1、2的分类 $categories = App\Category::with('blog')->find([1, 2]); // 提取所有分类下的博客,展平为一维数组并按ID去重 $relatedBlogs = $categories->pluck('blog')->flatten()->unique('id');
思路二:直接从Blog模型反向查询(更高效)
既然你的目标是找到关联了分类1或2的博客,不如直接从Blog模型出发,通过whereHas筛选关联条件,这种方式不需要先查询分类再处理,数据库查询逻辑更高效:
$relatedBlogs = App\Blog::whereHas('category', function ($query) { $query->whereIn('id', [1, 2]); })->get();
额外小建议:优化关联方法命名
从语义化角度来说,多对多关联的方法名用复数会更合理,能避免逻辑混淆:
- 在
Blog.php里把category()改成categories():public function categories() { return $this->belongsToMany('App\Category'); } - 在
Category.php里把blog()改成blogs():public function blogs() { return $this->belongsToMany('App\Blog'); }
这样后续调用的时候$category->blogs或者$blog->categories更符合逻辑,读代码的时候也更直观。
内容的提问来源于stack exchange,提问作者Kartik
相关产品推荐
相关产品推荐

