我有一个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_id
和category_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
我该如何解决这个问题?我的桌子设计是否适合这样的情况?我是否遵循了正确的策略?
答案 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。:如果两个字段都已设置,则验证将通过。所以你必须从视图层欺骗用户。例如,就我而言,我没有同时显示这两个字段。