我不确定,如何定义多个字段的唯一性。
我是否正确,以下两个例子都可以完成这项工作?
差异是什么,你喜欢什么?
第一个:
/** @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;
}
答案 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的测试中得出结论:
@Id创建主键(如果有更多属性共享此注释,则为复合词)
UniqueConstraints创建唯一索引
两者都保证了独特性。如果我理解正确,主要区别在于主键不能有空值,但唯一索引可以。