如何验证 CakePHP 中所需的关联存在?
How to validate required association presence in CakePHP?
我的 Proyectos 和 Medios 模型之间有一个有效的 belongsToMany 关联。如果我添加一个新的 Proyecto 实体,我可以从已注册的 Medios 中 select,并且一切都被充分保存。问题是无论我 select 是否有任何 Medio,实体都已正确保存,我希望它成为表单中的必填字段。
我尝试在表单中添加“required => true”,并在 ProyectoTable 中添加“$validator->notEmpty”,但它不起作用。 (即使没有 selected,它仍然保存表格。)
我一直在阅读 CakePHP 3.x 文档,但我一直没有找到验证关联数据是否存在的正确方法。我错过了什么? (我想我应该添加某种特殊规则,但我不知道应该如何放置以及放置在何处。)
我的模特:
class ProyectosTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
[...]
$this->belongsToMany('Medios', [
'foreignKey' => 'proyecto_id',
'targetForeignKey' => 'medio_id',
'joinTable' => 'medios_proyectos',
]);
}
public function validationDefault(Validator $validator)
{
[...]
$validator
->requirePresence('medios', 'create')
->notEmpty('medios');
return $validator;
}
}
我的控制器:
public function add()
{
$proyecto = $this->Proyectos->newEntity();
if ($this->request->is('post')) {
$partida = $this->Proyectos->patchEntity($proyecto, $this->request->getData());
if ($this->Proyectos->save($proyecto)) {
$this->Flash->success('El proyecto ha sido salvado.');
return $this->redirect(['action' => 'index']);
}
$this->Flash->error('El proyecto no pudo ser salvado.');
}
$medios = $this->Proyectos->Medios->find('list', ['limit' => 200]);
$this->set(compact('proyecto','medios'));
}
我的看法:
<?= $this->Form->create($proyecto) ?>
[...]
<?= $this->Form->control('medios._ids', ['options' => $medios,'required' => true]); ?>
[...]
<?= $this->Form->button('submit') ?>
<?= $this->Form->end() ?>
我已经尝试将其更改为“$validator->requirePresence('medios._ids', 'create')->notEmpty('medios._ids');”在模型中,但随后视图向我抛出“无法保存,必填字段”错误,无论我 select 一个,全部还是根本没有 Medio。
多个 select 控件确实有这样的隐藏回退:
<input type="hidden" name="medios[_ids]" value=""/>
因此,当什么都没有 selected 时,该场仍然存在,表明空 selection。使用 ._ids
您正在创建一个嵌套结构,因此为 medios
提交的值将永远不会被解释为空,您会收到如下内容:
[
'medios' => [
'_ids' => ''
]
]
因此 notEmpty
规则当然不适用于此处。此外验证规则字段名称不支持点语法,它们严格映射到第一级字段。
例如,您可以对 medios
字段使用嵌套验证器,该验证器的规则将应用于嵌套在 medios
下的字段。类似这样的事情:
public function validationDefault(Validator $validator)
{
// ...
$validator
->requirePresence('medios', 'create')
->addNested('medios', $this->getValidator('medios'));
return $validator;
}
public function validationMedios(Validator $validator)
{
$validator
->requirePresence('_ids')
->notEmpty('_ids');
return $validator;
}
另见
我的 Proyectos 和 Medios 模型之间有一个有效的 belongsToMany 关联。如果我添加一个新的 Proyecto 实体,我可以从已注册的 Medios 中 select,并且一切都被充分保存。问题是无论我 select 是否有任何 Medio,实体都已正确保存,我希望它成为表单中的必填字段。
我尝试在表单中添加“required => true”,并在 ProyectoTable 中添加“$validator->notEmpty”,但它不起作用。 (即使没有 selected,它仍然保存表格。)
我一直在阅读 CakePHP 3.x 文档,但我一直没有找到验证关联数据是否存在的正确方法。我错过了什么? (我想我应该添加某种特殊规则,但我不知道应该如何放置以及放置在何处。)
我的模特:
class ProyectosTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
[...]
$this->belongsToMany('Medios', [
'foreignKey' => 'proyecto_id',
'targetForeignKey' => 'medio_id',
'joinTable' => 'medios_proyectos',
]);
}
public function validationDefault(Validator $validator)
{
[...]
$validator
->requirePresence('medios', 'create')
->notEmpty('medios');
return $validator;
}
}
我的控制器:
public function add()
{
$proyecto = $this->Proyectos->newEntity();
if ($this->request->is('post')) {
$partida = $this->Proyectos->patchEntity($proyecto, $this->request->getData());
if ($this->Proyectos->save($proyecto)) {
$this->Flash->success('El proyecto ha sido salvado.');
return $this->redirect(['action' => 'index']);
}
$this->Flash->error('El proyecto no pudo ser salvado.');
}
$medios = $this->Proyectos->Medios->find('list', ['limit' => 200]);
$this->set(compact('proyecto','medios'));
}
我的看法:
<?= $this->Form->create($proyecto) ?>
[...]
<?= $this->Form->control('medios._ids', ['options' => $medios,'required' => true]); ?>
[...]
<?= $this->Form->button('submit') ?>
<?= $this->Form->end() ?>
我已经尝试将其更改为“$validator->requirePresence('medios._ids', 'create')->notEmpty('medios._ids');”在模型中,但随后视图向我抛出“无法保存,必填字段”错误,无论我 select 一个,全部还是根本没有 Medio。
多个 select 控件确实有这样的隐藏回退:
<input type="hidden" name="medios[_ids]" value=""/>
因此,当什么都没有 selected 时,该场仍然存在,表明空 selection。使用 ._ids
您正在创建一个嵌套结构,因此为 medios
提交的值将永远不会被解释为空,您会收到如下内容:
[
'medios' => [
'_ids' => ''
]
]
因此 notEmpty
规则当然不适用于此处。此外验证规则字段名称不支持点语法,它们严格映射到第一级字段。
例如,您可以对 medios
字段使用嵌套验证器,该验证器的规则将应用于嵌套在 medios
下的字段。类似这样的事情:
public function validationDefault(Validator $validator)
{
// ...
$validator
->requirePresence('medios', 'create')
->addNested('medios', $this->getValidator('medios'));
return $validator;
}
public function validationMedios(Validator $validator)
{
$validator
->requirePresence('_ids')
->notEmpty('_ids');
return $validator;
}
另见