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;
}