laravel中的条件表单验证

时间:2017-09-03 15:28:46

标签: php laravel validation

我有一个menus表,其中包含以下字段:

Schema::create('menus', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->integer('page_id')->unsigned()->nullable();
            $table->integer('category_id')->unsigned()->nullable();
            $table->timestamps();
});

条件是page_idcategory_id都无法同时填充。其中只有一个可以填充,另一个必须为空。

在我看来,我让用户决定他想选择哪一个。我显示一个包含两个项目的选择框:页面和类别。如果他选择了Pages,则会出现另一个包含页面列表的选择框,反之亦然。以下是一个示例:https://imgur.com/a/EFkzF

[很像wordpress菜单的想法]

以下是我的验证规则:

'title' => 'required|min:3',
'page_id' => 'nullable',
'category_id' => 'nullable'

这是我的$ fillable数组:

protected $fillable = ['title','page_id','category_id'];

在我的验证规则中,我无法将page_id或category_id设置为必需,因为技术上只需要其中一个,这将由用户采取的操作决定。它就像Schrödinger's cat,除非我打开盒子,否则我无法知道猫的状态。

我甚至无法将它们设置为可空,因为那时表单将通过验证而不使用page_id和category_id

我该如何解决这个问题?我的桌子设计是否适合这样的情况?我是否遵循了正确的策略?

2 个答案:

答案 0 :(得分:0)

我会做这样的事情

Schema::create('menus', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title');
        $table->integer('item_id')->unsigned();
        $table->enum('type', ['page', 'category']);
        $table->timestamps();

});

因此,在验证中,您可以为商品ID创建需求规则,用户可以选择页面或类别,这将进入枚举类型列“类型”。

希望这是有道理的。

答案 1 :(得分:0)

我不应该修改架构,而应该使用不带规则的必要条件,如下所述: https://laravel.com/docs/5.4/validation#rule-required-without

我的规则将成为:

onSaveInstanceState()

N.B。:如果两个字段都已设置,则验证将通过。所以你必须从视图层欺骗用户。例如,就我而言,我没有同时显示这两个字段。