2015-10-18 70 views
3

在数据库级别,如果使用一个选项来定义UNIQUENESS,如下所示,则没有区别。虽然@UniqueConstraint在其文档“”中读取它仅在SchemaTool模式生成上下文中有意义,“它们之间是否存在ORM级别差异?我的意思是当我们运行查询时,是否有不同的处理方式?@UniqueConstraint和@Column(unique = true)选项之间的Doctrine ORM级别差异

实例 - @UniqueConstraint

CLASS

/** 
* @ORM\Entity 
* @ORM\Table(
*  name="user", 
*  uniqueConstraints={ 
*   @ORM\UniqueConstraint(columns={"email"}) 
*  } 
*) 
*/ 
class User 
{ 
    /** 
    * @ORM\Column(name="email", type="string", length=100) 
    */ 
    private $email; 
} 

DQL

CREATE TABLE `user` (
    `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 
    UNIQUE KEY `UNIQ_8D93D649E7927C74` (`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

实例 - @Column - 独特=真

CLASS

/** 
* @ORM\Entity 
* @ORM\Table(name="user") 
*/ 
class User 
{ 
    /** 
    * @ORM\Column(name="email", type="string", length=100, unique=true) 
    */ 
    private $email; 
} 

DQL

CREATE TABLE `user` (
    `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 
    UNIQUE KEY `UNIQ_8D93D649E7927C74` (`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
+0

Btw。看起来你的第一个DQL是错误的,因为你在'@ UniqueConstraint'上声明了'name =“email_idx”',所以DQL也应该打印'UNIQUE KEY email_idx(email)'。 –

+0

我的不好,意味着要删除它。我会更新它。感谢您指出。 – BentCoder

回答

4

目前基本上没有区别。两者都在列上创建唯一的密钥。

但是@UniqueConstraint有更多的可能性。使用@UniqueConstraint,您可以为该键分配多个列的名称或跨度。缺点是键入更多(而不是更糟糕),并且列名必须是数据库中的列名称,而不是php属性名称。

unique=true@Column是在单个列上创建唯一键的最简单方法。

运行查询时,没有区别。 ORM不关心唯一的定义。特别是在插入时,您会从数据库中获取关于违反唯一性的事件,而不是从ORM中导致崩溃。您必须自行确保唯一性,例如使用Symfony中的独特实体验证。

相关问题