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

Laravel 8 如何从数据库读取并展示每个餐馆对应的菜单数据?

Laravel 餐馆与对应独立菜单实现方案

现有代码问题梳理

  • 路由为固定地址,无法区分不同餐馆的独立菜单页面
  • 控制器直接查询全表所有菜品,没有按餐馆维度筛选或分组
  • 视图循环语法错误:@foreach($data as $data) 会覆盖原集合变量,导致循环异常
  • 缺少首页餐馆列表的对应逻辑

分步修改实现

1. 确认数据库表结构

你需要提前准备两个关联表:

  • restaurants 表:存储餐馆基础信息,字段包含主键id、餐馆名称、封面图、介绍等
  • restaurants_menu 表:在现有字段基础上新增restaurant_id关联字段,对应restaurants表的主键id,用于绑定菜品所属的餐馆

2. 调整路由配置(web.php)

// 首页路由:展示所有餐馆列表
Route::get('/', [HomeController::class, 'index']);
// 单个餐馆菜单路由:携带餐馆id参数区分不同店铺的菜单
Route::get('/restaurant/{id}/menu', [HomeController::class, 'menu'])->name('restaurant.menu');

3. 修正控制器代码(HomeController.php)

// 首页获取所有餐馆列表
public function index()
{
    $restaurants = DB::table('restaurants')->get();
    return view('home', compact('restaurants'));
}

// 按传入的餐馆id查询对应菜单
public function menu($id)
{
    // 筛选当前餐馆的所有菜品
    $menus = DB::table('restaurants_menu')->where('restaurant_id', $id)->get();
    // 查询当前餐馆基础信息用于页面展示
    $restaurant = DB::table('restaurants')->where('id', $id)->first();
    return view('restaurant_menu', compact('menus', 'restaurant'));
}

4. 编写首页视图(home.blade.php,展示餐馆列表)

<div class="restaurant-list">
    @foreach($restaurants as $restaurant)
    <div class="restaurant-item">
        <img src="{{ $restaurant->cover_img }}" alt="{{ $restaurant->name }}" height="150">
        <h3>{{ $restaurant->name }}</h3>
        <p>{{ $restaurant->description }}</p>
        <!-- 点击跳转到对应餐馆的独立菜单页 -->
        <a href="{{ route('restaurant.menu', $restaurant->id) }}">查看菜单</a>
    </div>
    @endforeach
</div>

5. 修复菜单页视图(restaurant_menu.blade.php)

<div class="restaurant-info">
    <h1>{{ $restaurant->name }} 菜单</h1>
</div>
<div class="menu-container">
    @foreach($menus as $menu)
    <div class="box">
        <div class="box-img">
            <img src="{{ $menu->food_image }}" alt="{{ $menu->food_name }}" height="200">
        </div>
        <h2>{{ $menu->food_name }}</h2>
        <p>菜品ID:{{ $menu->menu_id }}</p>
        <h3>{{ $menu->food_description }}</h3>
    </div>
    @endforeach
</div>

注意事项

  • 路由参数{id}必须和控制器方法接收的$id变量名对应
  • 可自行增加参数校验逻辑,避免传入不存在的餐馆id时页面报错,比如查询为空时跳转404页面
  • 如果使用Eloquent模型,定义好餐馆和菜单的一对多关联后,可直接通过$restaurant->menus快速获取对应菜单,代码更简洁

内容的提问来源于stack exchange,提问作者Mhmd Al Halabi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:45:02