Laravel办公室工位预订系统嵌套if判断逻辑实现求助
工位预订系统Blade判断逻辑解决方案
第一步:优化控制器代码
原控制器查询逻辑存在冗余,我们先优化查询逻辑,提前计算全局状态减少视图层重复计算:
public function index() { // 预加载预订关联数据 $bookings = Booking::with('desk', 'user')->get(); // 提前判断当前登录用户是否已有有效预订 $userHasBooking = Auth::check() ? $bookings->contains('user_id', Auth::id()) : false; return view('index', [ 'rooms' => Room::with('desks')->get(), 'bookings' => $bookings, 'userHasBooking' => $userHasBooking, 'user' => Auth::user() ]); }
第二步:修正Blade视图嵌套判断逻辑
将原有重复的if判断改为互斥的if-else链,完整覆盖4种工位状态,替换原有视图中工位遍历部分的代码即可:
@if ($rooms->count()) <div class="grid grid-cols-1 gap-6 mt-5 pb-20"> @foreach ($rooms as $room) <div class="bg-white h-auto rounded-xl shadow-inner"> <div class="mx-3 my-4"> <div class="mt-2 text-2xl font-semibold text-gray-800 text-left pl-5"> {{ $room->name }} </div> <div class="lg:grid lg:grid-cols-5 gap-5 mt-4"> {{-- 直接使用预加载的房间关联工位遍历,无需额外过滤全局工位数据 --}} @foreach ($room->desks as $desk) {{-- 优先级1:判断当前工位是否已被预订 --}} @if ($deskBooking = $bookings->firstWhere('desk_id', $desk->id)) {{-- 状态1:当前工位是登录用户自己的预订 --}} @if ($deskBooking->user_id === $user->id) <x-grid.desks.my-booking :desk='$desk' :room="$room" :user="$user" /> @else {{-- 状态2:当前工位被其他用户预订 --}} <x-grid.desks.booked :desk='$desk' :room="$room" :user="$user" /> @endif @else {{-- 优先级2:工位未被预订时判断当前用户是否已有其他预订 --}} @if ($userHasBooking) {{-- 状态3:用户已有预订,剩余工位全部禁用 --}} <x-grid.desks.unavailable :desk='$desk' :room="$room" :user="$user" /> @else {{-- 状态4:工位可预订 --}} <div x-data="{show: false}"> <x-grid.desks.available :desk='$desk' :room="$room" :user="$user" /> </div> @endif @endif @endforeach </div> </div> </div> @endforeach </div> @else <p class="text-center text-xl mt-10">No bookings available yet. Please check back later!</p> @endif
优化说明
- 去掉了冗余的全局
$desks参数传递,直接使用预加载的关联数据$room->desks遍历,性能更高 - 用集合的
firstWhere方法一次查询即可拿到工位对应的预订记录,无需重复判断存在性 - 所有判断为互斥逻辑,不会出现单个工位匹配多个渲染组件的问题
- 控制器提前计算用户预订状态,避免每个工位遍历都重复计算同一状态,减少无效运算
内容的提问来源于stack exchange,提问作者robhill369
相关产品推荐
相关产品推荐

