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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:45:03