在 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",
提前致谢!
您指定
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),
],
];
}