Laravel Backpack中如何按eraser分类筛选展示商品列表?
解决Laravel Backpack商品列表按特定分类筛选的问题
错误原因分析
你之前在Product模型的category关联方法中添加where('id',1),只会限制商品关联的分类数据(即只有分类ID为1的商品能获取到分类信息),但不会筛选商品列表本身,所以所有商品依然会显示在列表中。
正确解决方案
1. 恢复模型的关联方法
先把Product模型里的关联方法改回正常的关联定义,不要加额外的where条件:
public function category() { return $this->belongsTo(Category::class); }
2. 在Crud控制器中添加筛选条件
在ProductCrudController的setupListOperation方法里,添加全局查询约束,筛选出分类为eraser的商品:
方式一:按分类名称筛选(更灵活)
protected function setupListOperation() { CRUD::column('name'); CRUD::column('created_at'); CRUD::column('updated_at'); $this->crud->addColumn([ 'label' => 'Category', 'type' => 'select', 'name' => 'category_id', 'entity' => 'category', 'attribute' => 'name' ]); // 添加分类筛选条件 $this->crud->addClause('whereHas', 'category', function ($query) { $query->where('name', 'eraser'); }); }
方式二:按分类ID筛选(性能更高)
如果你明确知道eraser分类的ID是1,可以直接通过category_id字段筛选:
protected function setupListOperation() { // 原有列定义... // 添加分类筛选条件 $this->crud->addClause('where', 'category_id', 1); }
这样就能确保商品列表只显示属于eraser分类的商品了。
内容的提问来源于stack exchange,提问作者MauizatulF
相关产品推荐
相关产品推荐

