0

我有一些这样的代码:

$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 的第一个唯一测试的单列,而第二个测试没有记录。但我没有抛出异常。

有什么想法吗?

编辑:

此外,我尝试使用 ->create() 函数代替 save() 函数。

4

1 回答 1

1

首先,您应该知道,在默认行为中,这些验证是在模型类初始化后立即从实际数据库模式创建的;在这种情况下,您不应该手动添加它们。

换句话说,模型的默认元数据策略是数据库自省策略

job_title因此,仅当该字段已为数据库方案中的唯一性检查编制索引时才会引发异常。如果您无法在数据库中实际创建此 PK,您可以更改模型的默认元数据策略,并手动设置元数据(叹气)。

于 2014-11-18T07:07:23.707 回答