2015-10-18 65 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中的獨特實體驗證。

相關問題