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

Laravel中如何根据店铺ID获取外键关联的菜单数据

原有代码问题说明

你当前的控制器逻辑存在3个核心错误:

  • 查询对象错误:直接查询shop表的name字段,拿到的是店铺名称,完全没有关联menu表,无法获取对应店铺的菜单数据
  • 缺少存在性校验:传入不存在的店铺ID时不会触发404响应,只会返回空结果
  • 语义不匹配:变量$men实际存储的是店铺数据,和菜单无关,视图层无法遍历输出菜单列表
正确实现方案

1. 配置模型关联(推荐Eloquent规范写法)

首先在两个模型中配置一对多关联关系:

  • 在app/Models/Shop.php中添加店铺和菜单的关联:
// 注意文件头部引入Menu模型:use App\Models\Menu;
public function menus()
{
    return $this->hasMany(Menu::class, 'shop_id');
}
  • (可选规范配置)在app/Models/Menu.php中添加菜单和店铺的反向关联:
// 注意文件头部引入Shop模型:use App\Models\Shop;
public function shop()
{
    return $this->belongsTo(Shop::class, 'shop_id');
}

2. 修正控制器逻辑

修改MeniuController的menu方法代码如下:

// 文件头部引入Shop模型:use App\Models\Shop;
public function menu($id)
{
    // 查询对应店铺,不存在则直接返回404
    $shop = Shop::findOrFail($id);
    // 通过关联查询该店铺下所有菜单,仅提取菜单名称字段
    $menus = $shop->menus()->select('name')->get();
    // 传递店铺信息和菜单列表到视图
    return view('meniu', compact('shop', 'menus'));
}

如果不想配置模型关联,也可以直接查询菜单表实现相同效果:

// 文件头部引入两个模型:use App\Models\Shop; use App\Models\Menu;
public function menu($id)
{
    // 校验店铺是否存在
    if (!Shop::where('id', $id)->exists()) {
        abort(404);
    }
    // 直接查询对应店铺ID下的所有菜单名称
    $menus = Menu::where('shop_id', $id)->select('name')->get();
    return view('meniu', compact('menus'));
}

3. 视图层输出示例

在resources/views/meniu.blade.php中遍历输出菜单名称即可:

<div class="menu-list">
    <h2>{{ $shop->name ?? '店铺' }} 菜单</h2>
    <ul>
        @foreach($menus as $menu)
            <li>{{ $menu->name }}</li>
        @endforeach
    </ul>
</div>

路由配置确认

确保routes/web.php中路由配置和访问格式匹配:

Route::get('/shop/{id}', [App\Http\Controllers\MeniuController::class, 'menu']);

内容的提问来源于stack exchange,提问作者Bekr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:42:43