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

Livewire表单多选教室存储容量并在下方表格展示的方案问询

多教室关联存储与展示实现方案

1. 组件属性与方法定义

在你使用的Livewire组件中新增以下属性和方法,用于临时存储已选教室列表,处理添加、删除逻辑:

// 临时存储已选教室列表
public $selectedClassrooms = [];

// 添加教室到临时列表
public function addClassroom()
{
    // 基础参数校验
    $this->validate([
        'classroom_id' => 'required|exists:classrooms,id',
        'capacity' => 'required|integer|min:1',
    ]);

    // 避免重复添加同一个教室
    foreach ($this->selectedClassrooms as $item) {
        if ($item['classroom_id'] == $this->classroom_id) {
            $this->addError('classroom_id', '该教室已添加,请勿重复选择');
            return;
        }
    }

    // 写入临时列表,注意这里的classroom_name对应你的教室选项里的名称字段,可自行调整
    $this->selectedClassrooms[] = [
        'classroom_id' => $this->classroom_id,
        'classroom_name' => collect($this->classrooms)->where('id', $this->classroom_id)->first()['name'],
        'capacity' => $this->capacity,
    ];

    // 清空输入项方便下一次添加
    $this->reset(['classroom_id', 'capacity']);
}

// 从临时列表删除指定教室
public function removeClassroom($index)
{
    unset($this->selectedClassrooms[$index]);
    $this->selectedClassrooms = array_values($this->selectedClassrooms);
}

// 如果是编辑页面,需要在mount方法中加载已关联的教室数据
public function mount()
{
    if ($this->form->id) {
        $this->selectedClassrooms = Classroom::where('course_id', $this->form->id)
            ->get()
            ->map(function ($item) {
                return [
                    'classroom_id' => $item->classroom_id,
                    'classroom_name' => $item->classroom->name, // 需确保Classroom模型有对应关联
                    'capacity' => $item->capacity,
                ];
            })
            ->toArray();
    }
}

2. 前端模板调整

2.1 原有表单部分新增添加按钮

<div class="sm:col-start-1 sm:col-end-3 col-span-3  ">
    <x-select x-on:change="isShowing = $event.target.value" name="classroom_id" label="{!! __('Classroom') !!}" wire:model="classroom_id"
            id="classroom_id"
            :options="$this->classrooms"/>
    <x-jet-input-error for="classroom_id" class="mt-2" />
</div>
<div class="col-span-2 sm:col-span-1 " x-show="isShowing">
    <label class="tf-form-label" for="capacity">
        {{ __('Capacity') }}
    </label>
    <div class="flex gap-2">
        <input wire:model.debounce.250ms="capacity" type="text" name="capacity" id="capacity" class="tf-input flex-1" />
        <button type="button" wire:click="addClassroom" class="tf-btn primary">{{ __('Add Classroom') }}</button>
    </div>
    <x-jet-input-error for="capacity" class="mt-2" />
</div>

2.2 表单下方新增已选教室展示表格

<!-- 已选教室列表展示 -->
@if(count($selectedClassrooms) > 0)
<div class="col-span-3 mt-6">
    <h3 class="text-lg font-medium mb-3">{{ __('Selected Classrooms') }}</h3>
    <table class="w-full border-collapse">
        <thead>
            <tr class="bg-gray-50">
                <th class="border px-4 py-2 text-left">{{ __('Classroom Name') }}</th>
                <th class="border px-4 py-2 text-left">{{ __('Capacity') }}</th>
                <th class="border px-4 py-2 text-center">{{ __('Operation') }}</th>
            </tr>
        </thead>
        <tbody>
            @foreach($selectedClassrooms as $index => $item)
            <tr>
                <td class="border px-4 py-2">{{ $item['classroom_name'] }}</td>
                <td class="border px-4 py-2">{{ $item['capacity'] }}</td>
                <td class="border px-4 py-2 text-center">
                    <button type="button" wire:click="removeClassroom({{ $index }})" class="text-red-500 hover:text-red-700">{{ __('Delete') }}</button>
                </td>
            </tr>
            @endforeach
        </tbody>
    </table>
</div>
@endif

3. 存储逻辑调整

首先在表单提交时新增校验,确保至少选择了一个教室:

$this->validate([
    'selectedClassrooms' => 'required|array|min:1',
    'selectedClassrooms.*.classroom_id' => 'required|exists:classrooms,id',
    'selectedClassrooms.*.capacity' => 'required|integer|min:1',
]);

然后把原有单条插入的逻辑改成批量插入,编辑场景需要先清空旧关联数据:

$this->form->save();// 保存课程基础信息

// 编辑场景先删除旧的关联数据,避免重复
Classroom::where('course_id', $this->form->id)->delete();

// 批量插入新的教室关联数据
$classroomData = collect($this->selectedClassrooms)->map(function ($item) {
    return [
        'course_id' => $this->form->id,
        'classroom_id' => $item['classroom_id'],
        'capacity' => $item['capacity'],
        'created_at' => now(),
        'updated_at' => now(),
    ];
})->toArray();
Classroom::insert($classroomData);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:18:03