Doctrig复合键与UniqueConstraint

时间:2017-01-12 13:52:50

标签: php sql doctrine-orm

我不确定,如何定义多个字段的唯一性。

我是否正确,以下两个例子都可以完成这项工作?

差异是什么,你喜欢什么?

第一个:

/** @ORM\Id */
private $id;

/** @ORM\Id */
private $title;

第二个:

/** @ORM\Table(name="productitem", uniqueConstraints={@UniqueConstraint(name="product_unique", columns={"id", "title"})})
 */
class ProductItem
{
private $id;
private $title;
}

2 个答案:

答案 0 :(得分:0)

如果您想确保您的标题对于不同的产品是唯一的,您不需要从标题和ID中创建复合键。

如果您确定您的产品标题是唯一的,则可以直接使用title作为密钥。但是不建议使用可能会将实体作为主键的实体更改的东西(产品标题当然可能会在其生命周期内发生变化)。在这种情况下,最好使用带有标识符(代理键)的不同列。

您只需使用unique属性将标题标记为唯一,您就不需要使用UniqueConstraint。查看the Doctrine documentation chapter: 21.2.1. @Column了解详情。

所以我建议关注:

/** 
 * @ORM\Id 
 * @ORM\Column(type="int")
 */
private $id;

/** 
 * @ORM\Column(type="string", unique=true)
 */
private $title;

答案 1 :(得分:0)

我从Postgresql DB的测试中得出结论:

  1. @Id创建主键(如果有更多属性共享此注释,则为复合词)

  2. UniqueConstraints创建唯一索引

  3. 两者都保证了独特性。如果我理解正确,主要区别在于主键不能有空值,但唯一索引可以。