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

Laravel Livewire动态输入框重复选项验证方案咨询

Laravel Livewire动态选项输入框的重复值验证需求

我需要验证动态添加的选项输入框是否存在重复选择的情况——比如不能同时在两个输入框里选「Size」。使用Laravel Livewire实现动态添加Size、Color这类选项输入框,当用户选择已被选过的选项时,要提示该选项已被选中。

输入框示例

当前Livewire控制器代码

public $i = -1;
public $inputs = [];
public $options = ['Size', 'Color', 'Material', 'Style'];
public $option_name; 

function rules()
{
    $rules = [];

    if ($this->inputs) {
        foreach ($this->inputs as $key => $val) {
            $rules['option_name.' . $val] =  ['required'];
        }
        return $rules;
    }
}

public function addLine($i)
{  
    $i = $i + 1;
    $this->i = $i;
    array_push($this->inputs, $i);
}

public function updated($propertyName)
{ 
    if ($this->inputs) {
        $this->validateOnly($propertyName);
    }
} 

当前Livewire视图代码

@forelse ($inputs as $key => $value)
    <x-native-select label="Option name" :options="$options" wire:model="option_name.{{ $value }}"/> {{-- 使用livewire-wireui组件 --}}
@empty
@endforelse
    
<a wire:click="addLine({{ $i }})" class="mt-4 text-sm cursor-pointer">
    + Add another option
</a>

实现步骤

1. 修改验证规则,添加唯一性验证

在rules()方法中,给每个option_name.*字段添加自定义闭包验证,检查当前选项是否已被其他输入框选中:

function rules()
{
    $rules = [];

    if ($this->inputs) {
        foreach ($this->inputs as $key => $val) {
            $rules['option_name.' . $val] = [
                'required',
                function ($attribute, $value, $fail) use ($val) {
                    // 收集所有已选选项,排除当前字段的值
                    $selectedOptions = collect($this->option_name)
                        ->filter(fn($item, $index) => $index != $val)
                        ->toArray();
                    
                    // 若当前值已存在,触发错误提示
                    if (in_array($value, $selectedOptions)) {
                        $fail('该选项已被选中,请选择其他选项');
                    }
                }
            ];
        }
        return $rules;
    }
    
    return [];
}

2. 保留实时验证逻辑

原updated方法已实现字段更新时触发验证,无需修改,确保每次选择后即时检查:

public function updated($propertyName)
{
    $this->validateOnly($propertyName);
}

3. 优化视图显示错误提示

WireUI组件会自动读取错误信息,也可手动添加错误提示标签增强可读性:

@forelse ($inputs as $key => $value)
    <div class="mb-4">
        <x-native-select label="Option name" :options="$options" wire:model="option_name.{{ $value }}"/>
        @error('option_name.' . $value)
            <span class="text-red-500 text-sm mt-1">{{ $message }}</span>
        @enderror
    </div>
@empty
@endforelse
    
<a wire:click="addLine({{ $i }})" class="mt-4 text-sm cursor-pointer">
    + Add another option
</a>

可选优化:简化添加逻辑

修改addLine方法,无需传递参数,直接自增索引:

public function addLine()
{  
    $this->i++;
    $this->inputs[] = $this->i;
}

对应视图调用改为:

<a wire:click="addLine" class="mt-4 text-sm cursor-pointer">
    + Add another option
</a>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:10:25