我有这样的代码:
$this->validate(new \Phalcon\Mvc\Model\Validator\Uniqueness(['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的Unique测试的单个列,而没有第二个的记录。但我没有得到抛出的例外。
有什么想法吗?
编辑:
另外,我尝试使用 - > create()函数代替save()函数。
答案 0 :(得分:1)
首先,您应该知道,在默认行为中,这些验证是在model class is initialized之后立即从实际数据库架构创建的;在这种情况下,你不应该手动添加它们。
换句话说,模型的默认元数据策略是Database Introspection Strategy
因此,只有在job_title
字段已经为数据库方案中的唯一性检查编制索引时才会引发异常。如果您无法在数据库中实际创建此PK,则可以更改模型的默认meta-data strategy,并手动设置元数据(叹气)。