Laravel实现点击分类展示关联商品 新手求助
实现Laravel分类菜单点击展示对应商品的完整步骤
看起来你已经搞定了分类菜单的层级展示,接下来咱们一步步实现点击分类展示对应商品的功能,跟着来就行~
1. 完善模型关联
首先得给Product模型和Category模型建立关联,毕竟商品和分类是一对多的关系:
新建/修改Product模型
创建app/Product.php(如果还没有的话):
namespace App; use Illuminate\Database\Eloquent\Model; class Product extends Model { // 若你的表名不是默认的`products`,需手动指定 // public $table = "products"; // 定义商品所属的分类关联 public function category() { return $this->belongsTo('App\Category', 'category_id'); } }
在Category模型中添加商品关联
修改你已有的Category模型,加上关联商品的方法:
// 在Category类中新增方法 public function products() { return $this->hasMany('App\Product', 'category_id'); }
2. 添加路由
打开routes/web.php,添加一个处理分类商品请求的路由:
// 路由名称方便后续调用,参数`id`为分类ID Route::get('/category/{id}/products', 'CategoryController@showProducts')->name('category.products');
3. 修改分类菜单的链接
把视图里每个分类项的空链接,替换成我们刚定义的路由,传递对应分类的ID:
- 一级分类链接修改:
将原来的<a id="cate" class="nav-links__item-link" href="{{$firstmenu->cate_name}}">改成:
<a id="cate" class="nav-links__item-link" href="{{route('category.products', ['id' => $firstmenu->id])}}">
- 二级分类链接修改:
将<a href="">{{$secondmenu->cate_name}}</a>改成:
<a href="{{route('category.products', ['id' => $secondmenu->id])}}">{{$secondmenu->cate_name}}</a>
- 三级分类链接修改:
将<li class="megamenu__item"><a href="">{{$thirdmenu->cate_name}}</a></li>改成:
<li class="megamenu__item"><a href="{{route('category.products', ['id' => $thirdmenu->id])}}">{{$thirdmenu->cate_name}}</a></li>
4. 编写控制器逻辑
创建CategoryController(若未存在),并实现展示商品的方法:
namespace App\Http\Controllers; use App\Category; use Illuminate\Http\Request; class CategoryController extends Controller { public function showProducts($id) { // 查找指定分类,找不到则返回404 $category = Category::findOrFail($id); // 可选:若需要展示当前分类+所有子分类的商品,递归获取所有子分类ID $categoryIds = $this->getAllChildCategoryIds($category); $categoryIds[] = $category->id; // 加上当前分类ID // 查询对应分类下的商品 $products = \App\Product::whereIn('category_id', $categoryIds)->get(); // 仅展示当前分类商品的话,直接用:$products = $category->products; // 返回视图并传递数据 return view('category.products', compact('category', 'products')); } // 递归获取所有子分类ID的辅助方法 private function getAllChildCategoryIds($category) { $ids = []; foreach ($category->childs as $child) { $ids[] = $child->id; $ids = array_merge($ids, $this->getAllChildCategoryIds($child)); } return $ids; } }
5. 创建商品列表视图
新建resources/views/category/products.blade.php,用来渲染商品列表:
<div class="container mt-4"> <h2>{{$category->cate_name}} 分类商品</h2> <div class="row"> @foreach($products as $product) <div class="col-md-3 mb-4"> <div class="card"> <!-- 根据你的商品表字段调整内容,比如名称、价格、图片等 --> <div class="card-body"> <h5 class="card-title">{{$product->name}}</h5> <p class="card-text">¥ {{$product->price}}</p> <!-- 可添加商品详情链接等 --> </div> </div> </div> @endforeach @empty($products) <div class="col-12 text-center"> <p>该分类下暂无商品哦~</p> </div> @endempty </div> </div>
这样操作后,点击菜单里的任意分类项,就能跳转到对应的商品列表页面啦!
内容的提问来源于stack exchange,提问作者user12310958
相关产品推荐
相关产品推荐

