2012-06-11 45 views
4

我正在嘗試創建一個2個字段的UniqueEntity(都是ManyToOne字段)。Doctrine @UniqueEntity與ManyToOne字段?

的代碼如下:

/* 
* @ORM\Table() 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks() 
* @UniqueEntity(fields={"user", "connect"}) 
*/ 
class UserConnect 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var boolean $isLeader 
    * 
    * @ORM\Column(name="isLeader", type="boolean") 
    */ 
    private $isLeader; 

    /** 
    * @var date $joinedDate 
    * 
    * @ORM\Column(name="joinedDate", type="date") 
    */ 
    private $joinedDate; 

    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="userConnects") 
    * 
    */ 
    private $user; 

    /** 
    * @ORM\ManyToOne(targetEntity="Connect", inversedBy="userConnects") 
    * 
    */ 
    private $connect; 

我們的目標是確保我有隻有一個實體,與一個CONNECT連接的用戶。

我應該在@UniqueEntity聲明中寫些別的東西嗎?

回答

-1

您應該在您的屬性註釋中添加唯一聲明。

/** 
* @ORM\ManyToOne(targetEntity="User", inversedBy="userConnects") 
* @ORM\Column(unique=true) 
*/ 
private $user; 

/** 
* @ORM\ManyToOne(targetEntity="Connect", inversedBy="userConnects") 
* @ORM\Column(unique=true) 
*/ 
private $connect; 

看到這個symfony doc,這StackOverflow上answer

+0

這是不正確的。這將使得每個用戶只能綁定一個連接,而每個連接只能綁定一個用戶。 @Estopero的答案有正確的答案,以及這個解釋 – Fodagus

7

我明白你想要得到一個錯誤,只有當這兩個用戶連接領域的一個記錄在數據庫中的其他記錄被複制。

@UniqueEntity註釋是正確宣告你的目的(多列索引),但只有在表單驗證被觸發,並且不影響DDBB架構。

如果你想添加在數據庫級,你應該使用在表()聲明中的@UniqueConstraint註釋,給一個名爲新的指數相同的檢查。喜歡的東西:

/* 
* @ORM\Table(uniqueConstraints={@ORM\UniqueConstraint(name="IDX_USER_CONNECT", columns={"user_id", "connect_id"})}) 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks() 
* @UniqueEntity(fields={"user", "connect"}) 
*/ 
class UserConnect 
{ 

在另一方面,如果聲明@ORM \列(唯一= TRUE)在每個屬性,你會得到一個非常不同的行爲,它不會是一個多列索引,但是您將擁有兩個獨立的唯一列,如果輸入兩次相同的user_id,則將獨立於connect_id值而獲得錯誤,並且如果輸入兩次相同的connect_id值,則會發生相同的錯誤。

+0

很好地解釋了答案 –

5

這工作:

/** 
* State 
* 
* @ORM\Table(
* name="general.states", 
* uniqueConstraints={ 
*  @ORM\UniqueConstraint(name="states_country_name_code_key", columns={"idcountry", "name","code"}), 
* }) 
* @ORM\Entity(repositoryClass="Fluency\Bundle\GeneralBundle\Entity\Repository\StateRepository") 
*/ 
class State 
{....... 

從實體採取我的系統上。這種方式影響數據庫模式。看我把@\ORM\UniqueConstraint annotation放在哪裏。對不起@estopero ...下次我必須先閱讀其他答案。