Laravel 8使用laravel-nestedset获取分类及其所有子分类的全部文章
解决方法
问题原因
你当前定义的posts()关联仅会查询当前分类直接关联的文章,不会自动包含后代子分类下的内容,因此查询结果不符合预期。
前置要求
确认你的Category模型已经引入了laravel-nestedset扩展的核心trait:
use Kalnoy\Nestedset\NodeTrait; class Category extends Model { use NodeTrait; // 必须引入该trait才能使用嵌套集的查询方法 // 原有关联代码保持不变 }
实现方案
在Category模型中新增自定义方法,先获取当前分类+所有后代分类的ID,再批量查询对应分类下的所有文章即可:
1. 基础实现(直接返回结果)
// 写在Category模型中 public function getAllPosts() { // descendantsAndSelf()是laravel-nestedset提供的方法,可一次性查询当前节点+所有后代节点 $validCategoryIds = $this->descendantsAndSelf()->pluck('id'); return \App\Models\Post::whereIn('category_id', $validCategoryIds)->get(); }
调用方式:
// 查询category1的所有文章,将返回15条 $category1->getAllPosts(); // 查询category2的所有文章,将返回15条 $category2->getAllPosts(); // 查询category3的所有文章,将返回5条 $category3->getAllPosts();
2. 灵活实现(返回查询构造器,支持链式操作)
如果需要后续加筛选条件、分页等操作,可以改成返回查询构造器:
// 写在Category模型中 public function allPosts() { $validCategoryIds = $this->descendantsAndSelf()->pluck('id'); return \App\Models\Post::whereIn('category_id', $validCategoryIds); }
调用示例:
// 分页查询已发布的文章 $posts = $category->allPosts()->where('status', 'published')->paginate(10); // 统计文章总数 $count = $category->allPosts()->count();
3. 支持分类状态过滤
如果需要只查询已发布的分类下的文章,可以在查询分类ID时加筛选条件:
$validCategoryIds = $this->descendantsAndSelf()->where('publish', 1)->pluck('id');
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

