在类别表中,我有以下几列id,parent_id,title
现在,parent_id是子类别的父类别,但是对于根/主要类别,parent_id为0,因为它们没有父类别!
<?php
'parent_id'=>'required|exists:categories,id|nullable'
// wont work, because parent_id = 0
我也[有时]运气不好!
我认为您的问题在exists
之内。从Laravel 5.8 exists' docs
正在验证的字段必须存在于给定的数据库表上
适用于您的情况:您正在要求验证中的字段的值必须与类别表中的现有ID相匹配,并且您要断言
对于根/主要类别,parent_id为0,因为它们没有父项
并且如果它们没有父项它们的parent_id
与分类表中的任何id
不匹配。
还请注意,required
和nullable
不应位于同一验证字段上:来自required rule's docs
验证中的字段必须存在于输入数据中,而不是空的。如果满足以下条件之一,则该字段被视为“空”条件为真:
- 该值为空。
- ...
正在验证的字段可能为空。
因此,您请求该字段不为空,但是您允许null
值,但required
验证规则拒绝了该值。
最后,要解决您的问题,您必须做:
[
'parent_id' => 'exists:categories,id|nullable'
]
并在根类别上设置NULL
,或使用
[
'parent_id' => 'required'
]
并手动检查数据库中是否存在parent_id
,但根目录类别将具有0
旁注:为确保在parent_id
字段中插入现有ID,建议您添加外键约束并在根类别上设置NULL
:
Schema::create('categories', function (Blueprint $table) {
$table->bigIncrements('id');
// other definitions...
$table->unsignedBigInteger('parent_id')->nullable();
$table->foreign('parent_id')->references('id')->on('categories');
});