You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:40:42