Laravel验证存在,但零不可为空

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

在类别表中,我有以下几列id,parent_id,title

现在,parent_id是子类别的父类别,但是对于根/主要类别,parent_id为0,因为它们没有父类别!

<?php
'parent_id'=>'required|exists:categories,id|nullable' 
// wont work, because parent_id = 0

我也[有时]运气不好!

php laravel-5 laravel-validation
1个回答
1
投票

我认为您的问题在exists之内。从Laravel 5.8 exists' docs

正在验证的字段必须存在于给定的数据库表上

适用于您的情况:您正在要求验证中的字段的值必须与类别表中的现有ID相匹配,并且您要断言

对于根/主要类别,parent_id为0,因为它们没有父项

并且如果它们没有父项它们的parent_id与分类表中的任何id不匹配。

还请注意,requirednullable不应位于同一验证字段上:来自required rule's docs

验证中的字段必须存在于输入数据中,而不是空的。如果满足以下条件之一,则该字段被视为“空”条件为真:

  • 该值为空。
  • ...

并且来自nullable 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');
});
© www.soinside.com 2019 - 2024. All rights reserved.