我有一些这样的代码:
$this->validate(new PhalconMvcModelValidatorUniqueness(['field' => $field]));
if (true == $this->validationHasFailed()) {
throw new SpecialInternalUniqueException();
}
这适用于除自然主键之外的所有列。 即,不是代理键的主键(自动递增整数)。 例如,在job_titles表中,自然键列是"job_title"——在我们的例子中,它指的是职务的名称。 这个名称应该是唯一的,我希望能够在保存之前在代码中检查它。 然而,Phalcon不知何故愉快地忽略了它。
我现在实际上正在为此设置一个单元测试,并执行类似于以下内容的操作:
$job_title = new JobTitles();
$job_title->job_title = 'Unique Test';
$job_title->description = 'Desc A';
$job_title->save();
$job_title2 = new JobTitles();
$job_title2->job_title = 'Unique Test';
$job_title->description = 'Desc B';
$job_title->save();
永远不会引发异常。 数据库中的最终是使用 Desc A 的第一个唯一测试的单列,而第二个测试没有记录。 但我没有得到抛出的异常。
有什么想法吗?
编辑:
另外,我尝试使用 ->create() 函数代替 save() 函数。
首先,您应该知道,在默认行为中,这些验证是在初始化模型类后立即从实际数据库架构创建的;在这种情况下,您不应该手动添加它们。
换句话说,模型的默认元数据策略是数据库自检策略
因此,仅当 job_title
字段已在数据库方案中索引以进行唯一性检查时,才会引发异常。如果您无法在数据库中实际创建此 PK,您可以更改模型的默认元数据策略,然后他们手动设置元数据(叹息)。