You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel 8.77项目中Query Scope不生效,无法展示过滤后数据问题求助

解决Laravel 8 Query Scope不生效的问题

嘿,我看到你碰到了Laravel Query Scope不生效的问题,咱们一步步来排查并修复:

1. 请求参数名不匹配

你访问的URL里用的是 ?categories=nihil-est-odit-nam-provident-omnis,但在控制器的filter()方法里,你传递的是request(['search', 'category'])——这里的参数名是category(单数),但URL里是categories(复数)!这就导致$filters['category']永远是null,自然不会触发分类过滤逻辑。

修复方法
要么把URL里的参数改成?category=xxx,要么把控制器里的请求参数改成request(['search', 'categories']),同时更新scopeFilter里的判断为$filters['categories'] ?? false。推荐前者,保持参数名和逻辑里的命名一致。

2. 分类查询中的表名拼写错误

在你的scopeFilter方法里,分类查询的闭包中有个拼写错误:

->where('category.slug', $category)

这里的表名应该是categories(复数),因为你在子查询里指定了from('categories'),正确的写法是categories.slug,不然会触发“未知列category.slug”的错误(如果没报错,大概率是表结构或命名的问题,但拼写错误是核心原因)。

修正后的完整代码

模型中的scopeFilter方法:

public function scopeFilter($query, array $filters) {
    // 搜索过滤逻辑
    $query->when($filters['search'] ?? false, fn($query, $search) => $query 
        ->where('title', 'like', '%' . $search . '%') 
        ->orWhere('body', 'like', '%' . $search . '%') 
    );
    // 分类过滤逻辑(修正了表名拼写)
    $query->when($filters['category'] ?? false, fn($query, $category) => $query 
        ->whereExists(fn($query) => $query 
            ->from('categories') 
            ->whereColumn('categories.id', 'posts.category_id') 
            ->where('categories.slug', $category) // 这里改成categories.slug
        ) 
    );
}

控制器中的index方法(确保参数名匹配):

public function index() {
    // 可以临时加这行调试,确认是否正确获取到过滤参数
    // dd(request()->all());
    
    return view('posts', [
        'posts' => Post::latest()->filter(request(['search', 'category']))->get(),
        'categories' => Category::all()
    ]);
}

额外调试小技巧

  • dd(request()->all())确认你是否正确获取到了category参数;
  • dd(Post::latest()->filter(request(['search', 'category']))->toSql())查看生成的SQL语句,确认过滤条件是否被正确添加;
  • 检查你的posts表是否有category_id字段,且和categories表的id字段关联正确。

现在访问127.0.0.1:8000/?category=nihil-est-odit-nam-provident-omnis(注意参数名是单数category),应该就能正确过滤出对应分类的文章了。

内容的提问来源于stack exchange,提问作者Danish Mehmood

火山引擎 最新活动