Validation CakePHP 3.x唯一验证不适用于保存多条记录
我有一个Validation CakePHP 3.x唯一验证不适用于保存多条记录,validation,cakephp,cakephp-3.0,Validation,Cakephp,Cakephp 3.0,我有一个问题表,该表具有如下验证: $validator ->notEmpty('title') ->add('title', [ 'unique' => [ 'rule' => [ 'validateUnique', ['scope' => ['subject_id', 'chapter_id']] ]
问题
表,该表具有如下验证:
$validator
->notEmpty('title')
->add('title', [
'unique' => [
'rule' => [
'validateUnique',
['scope' => ['subject_id', 'chapter_id']]
],
'provider' => 'table'
]
]);
我想一次将以下记录保存到我的表中
Array
(
[0] => Array
(
[subject_id] => 1
[chapter_id] => 4
[title] => What is a .ctp file used for in CakePHP?
)
[1] => Array
(
[subject_id] => 1
[chapter_id] => 4
[title] => What is a .ctp file used for in CakePHP?
)
)
我尝试使用saveMany()
方法保存它。它保存两个记录,即验证不起作用。我还尝试为transactional()
方法而不是saveMany()
方法编写以下代码,但验证也不起作用
$entities = $this->Questions->newEntities($records);
$this->Questions->connection()->transactional(function () use ($entities) {
foreach ($entities as $entity) {
$this->Questions->save($entity);
}
});
如果我使用save()
方法逐个保存记录,或者我的记录已经保存在数据库中,则验证工作正常。为什么我的唯一验证不适用于重复的新实体的saveMany()
和transactional()
验证在保存之前进行,因此行为是预期的,因为规则查找数据库,而不是请求数据(它在任何时候都只能访问一组数据),也就是说,无论测试多少数据集,都不会保存提交的数据集,因此,除非数据库中已经存在匹配的记录,否则验证将通过
因此,在自定义事务中逐个创建/修补并保存所有实体(不要忘记添加一些适当的故障检查)
另见
transactional()
方法,那么这两个方法中只有一个记录保存在数据库中。如果我在我的transactional()
中按照您的建议使用生成规则,则这两个规则都不会保存在数据库中。如果我在您的transactional()中按照您的建议使用生成规则,则一切正常。
$this->Questions->connection()->transactional(function () {
foreach ($this->request->data() as $set) {
$entity = $this->Questions->newEntity($set); // < validaton is being applied there
if (!$this->Questions->save($entity)) { // < not there
return false;
}
}
return true;
});
// QuestionsTable class
public function buildRules(\Cake\ORM\RulesChecker $rules)
{
$rules->add($rules->isUnique(['title', 'subject_id', 'chapter_id']));
// ...
return $rules;
}