为什么唯一规则在 livewire 验证属性中不起作用?

问题描述 投票:0回答:1

在 laravel / livewire 站点项目模型上具有唯一的“标题”字段,我在验证属性中添加了唯一的

class ItemEditor extends Component
{

    #[Validate('required|string|min:3|max:255|unique:items,id')]
    public string $title = '';

但它在方法中不起作用:

public function store(): void
{
    $this->validate();

    try {
        DB::beginTransaction();

        $item = Item::create([
            'title' => $this->title,
            ...
        ]);

在望远镜下检查 sql 我看到声明:

   SELECT count(*)     AS aggregate
    FROM `items`
    WHERE `id` = 'Title 5'

但无论如何,验证唯一规则不起作用(其余规则工作正常)。

验证的唯一规则存在一些语法错误?

    "laravel/framework": "^11.31",
    "laravel/jetstream": "^5.3",
    "livewire/livewire": "^3.0",

提前致谢!

laravel-livewire laravel-validation
1个回答
0
投票

您指定

id
列应该是唯一的,也就是说 - 它正在检查
$title
属性中是否存在存在于
id
表的
items
列中的值.

如果您正在创建记录(而不是更新它们),则无需指定忽略值,并且它应该与您拥有的内容一起使用(减去末尾的

,id

#[Validate('required|string|min:3|max:255|unique:items')]

但是,如果您要更新现有记录,则需要使用

rules()
方法来指定在检查唯一性时“忽略”哪条记录(因此您忽略当前记录,从而允许更新记录,但保留相同的标题)。

protected function rules()
{
    return [
        'title' => [
            'required',
            'string',
            'min:3',
            'max:255',
            'unique:items,id'
            \Illuminate\Validation\Rule::unique('items')->ignore($this->itemId), 
        ],
    ];
}
© www.soinside.com 2019 - 2024. All rights reserved.