Laravel需求:仅显示存在关联商品的分类
实现仅展示关联商品的分类列表
1. 确认模型关联关系
确保分类模型(Gmcategories)和商品模型(Gmproducts)已正确定义关联:
Gmcategories.php
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Gmcategories extends Model { // 一个分类对应多个商品,外键需根据你的实际表字段调整 public function products() { return $this->hasMany(Gmproducts::class, 'category_id'); } }
Gmproducts.php
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Gmproducts extends Model { // 一个商品归属一个分类 public function category() { return $this->belongsTo(Gmcategories::class, 'category_id'); } }
2. 控制器层面过滤有商品的分类
在控制器方法中,使用whereHas筛选出关联商品存在的分类,替代原有的全量查询:
示例控制器代码
namespace App\Http\Controllers; use App\Models\Gmcategories; class CategoryController extends Controller { public function index() { // 仅查询拥有至少一个商品的分类 $categories = Gmcategories::whereHas('products')->get(); return view('your-view-path', compact('categories')); // 替换为你的实际视图路径 } }
如果需要附加商品状态筛选(比如仅显示关联上架商品的分类),可以在whereHas中追加条件:
$categories = Gmcategories::whereHas('products', function($query) { $query->where('status', 1); // 假设status=1代表商品上架 })->get();
3. (可选)模型中添加复用查询作用域
如果需要在多个场景复用该筛选逻辑,可在Gmcategories模型中定义查询作用域:
Gmcategories.php
public function scopeHasProducts($query) { return $query->whereHas('products'); }
之后控制器中可简化调用:
$categories = Gmcategories::hasProducts()->get();
4. Blade视图直接渲染即可
因为控制器已过滤掉无商品的分类,视图无需额外判断,直接循环渲染:
示例Blade代码
<div class="category-list"> @foreach($categories as $category) <div class="category-item"> <h3>{{ $category->name }}</h3> <!-- 如需展示分类下商品,直接循环关联即可 --> <div class="product-list"> @foreach($category->products as $product) <span>{{ $product->name }}</span> @endforeach </div> </div> @endforeach </div>
内容的提问来源于stack exchange,提问作者My Buzynis
相关产品推荐
相关产品推荐

