You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:01:55