如何在ActiveRecord(Yii2)中设置多个字段的唯一性?

时间:2014-12-19 11:46:22

标签: yii2

如何在ActiveRecord(Yii2)中为多个字段设置唯一性? 我试过手写的

['a1', 'unique', 'targetAttribute' => ['a1', 'a2']]

但它不起作用。

3 个答案:

答案 0 :(得分:17)

没有更长的相关性(这似乎是Yii 2早期版本中的一个错误):

您应该使用attribute而不是targetAttribute

['a1', 'unique', 'attribute' => ['a1', 'a2']]

在这种情况下,字段'a1'将收到错误消息。

另一个案例:

[['a1', 'a2'], 'unique', 'attribute' => ['a1', 'a2']]

如果'a1'和'a2'不是唯一的,那么'a1'和'a2'属性将收到错误消息。


<强> CORRECT

来自docs(经过验证的工作示例)

// a1 needs to be unique
['a1', 'unique']
// a1 needs to be unique, but column a2 will be used to check the uniqueness of the a1 value
['a1', 'unique', 'targetAttribute' => 'a2']
// a1 and a2 need to be unique together, and they both will receive error message
[['a1', 'a2'], 'unique', 'targetAttribute' => ['a1', 'a2']]
// a1 and a2 need to be unique together, only a1 will receive error message
['a1', 'unique', 'targetAttribute' => ['a1', 'a2']]
// a1 needs to be unique by checking the uniqueness of both a2 and a3 (using a1 value)
['a1', 'unique', 'targetAttribute' => ['a2', 'a1' => 'a3']]

答案 1 :(得分:4)

targetAttribute将使用截至最新的yii2 docs(2017)

['a1', 'unique', 'targetAttribute' => ['a1', 'a2']]

在这种情况下,字段&#39; a1&#39;将收到错误消息。

另一个案例:

[['a1', 'a2'], 'unique', 'attribute' => ['a1', 'a2']]

现在&#39; a1&#39;和&#39; a2&#39;如果&#39; a1&#39;属性将收到错误消息和&#39; a2&#39;并不是唯一的。

将使用自定义消息comboNotUnique

代替message

[['a1', 'a2'], 'comboNotUnique' => 'Package Id already exist.', 'unique', 'attribute' => ['a1', 'a2']]

答案 2 :(得分:1)

您可以编写如下所示的唯一字段:

[['field1','field2'], 'unique']

现在,field1field2都应该是唯一的。

截至Yii2的官方文件:

  

targetAttributetargetClass中属性的名称,用于验证输入值的唯一性。如果未设置,它将使用当前正在验证的属性的名称。 您可以使用数组同时验证多列的唯一性