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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:54:04