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
相关产品推荐
相关产品推荐

