能否通过单条SQL按分类层级列同供应商商品并在Laravel传值到视图
问题解答
是否可以通过单条SQL实现需求?
- 可以实现关联数据查询,但不推荐在SQL层直接拼接最终展示格式。SQL的核心职责是拉取关联数据,最终的嵌套层级结构放到业务层组装,可维护性远高于在SQL中写复杂嵌套、用
GROUP_CONCAT之类的函数硬拼展示字符串。 - 单条关联查询的参考SQL如下,执行后会得到「主分类-子分类-单个商品」维度的扁平化结果集:
SELECT c.name AS category_name, sc.name AS subcategory_name, p.name AS product_name FROM categories c LEFT JOIN subcategories sc ON sc.category_id = c.id LEFT JOIN products p ON p.subcategory_id = sc.id -- 替换为实际要查询的供应商ID,保证所有商品归属同一供应商 WHERE p.supplier_id = ? ORDER BY c.id, sc.id, p.id
Laravel框架是否支持查询结果传值到视图渲染?
- 完全支持,用框架自带的Eloquent ORM关联+预加载即可实现,还能自动避免N+1查询问题,不需要手写复杂原生SQL,实现步骤如下:
- 先给对应模型定义关联关系
// app/Models/Category.php 主分类模型 public function subcategories() { return $this->hasMany(Subcategory::class); } // app/Models/Subcategory.php 子分类模型 public function products() { return $this->hasMany(Product::class); }
- 控制器层完成数据查询、过滤,传递给视图
// 示例:查询ID为3的供应商对应的分类-商品结构 $targetSupplierId = 3; $categoryList = Category::with([ // 预加载子分类,过滤掉无对应供应商商品的无效子分类 'subcategories' => function ($subQuery) use ($targetSupplierId) { $subQuery->whereHas('products', fn($pQuery) => $pQuery->where('supplier_id', $targetSupplierId)) // 预加载子分类下归属目标供应商的商品 ->with(['products' => fn($pQuery) => $pQuery->where('supplier_id', $targetSupplierId)]); } ])->get(); // 传数据到视图 return view('product.category_list', compact('categoryList'));
- 视图层嵌套循环,直接渲染出要求的结构
@foreach($categoryList as $category) <strong>{{ $category->name }}</strong> <ul> @foreach($category->subcategories as $subcategory) <li> <p>{{ $subcategory->name }}</p> @foreach($subcategory->products as $product) <p>++{{ $product->name }}</p> @endforeach </li> @endforeach </ul> @endforeach
内容的提问来源于stack exchange,提问作者rh2o
相关产品推荐
相关产品推荐

