2017-10-19 81 views
0
兩個字段的唯一約束

我有一個現有的Symfony實體:添加一個主鍵,以現有的實體在Symfony的

/** 
* MyApp\AppBundle\Entity\UserSelection 
* 
* @ORM\Table(name="user_selection",uniqueConstraints={@ORM\UniqueConstraint(name="unique", columns={"user_id", "selection_id"})}) 
* @ORM\Entity(repositoryClass="MyApp\AppBundle\Entity\UserSelectionRepository") 
*/ 
class UserSelection 
{ 

    /** 
    * @var integer $userId 
    * @ORM\Id 
    * @ORM\Column(name="user_id", type="integer") 
    */ 
    private $userId; 

    /** 
    * @var integer $selectionId 
    * @ORM\Id 
    * @ORM\Column(name="selection_id", type="integer") 
    */ 
    private $selectionId; 
} 

我試圖重構一些代碼和運行

php app/console generate:doctrine:form MyAppAppBundle:UserSelection 

我得到

表單生成器不支持包含多個主鍵的實體類。

......這是可以理解的(thanks)。按原樣使用實體並手動創建表單類型是否正常?或者在實體中放置一個id字段更好?如果我這樣做,什麼樣的配置最好?

例如

/** 
* MyApp\AppBundle\Entity\UserSelection 
* 
* @ORM\Table(name="user_selection",uniqueConstraints={@ORM\UniqueConstraint(name="unique", columns={"user_id", "selection_id"})}) 
* @ORM\Entity(repositoryClass="MyApp\AppBundle\Entity\UserSelectionRepository") 
*/ 
class UserSelection 
{ 

    /** 
    * @var integer $id 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\GeneratedValue(strategy="UUID") 
    */ 
    private $id; 

    /** 
    * @var integer $userId 
    * @ORM\Id 
    * @ORM\Column(name="user_id", type="integer") 
    */ 
    private $userId; 

    /** 
    * @var integer $selectionId 
    * @ORM\Id 
    * @ORM\Column(name="selection_id", type="integer") 
    */ 
    private $selectionId; 
} 

產生錯誤

具有複合標識符,但使用了比手動分配(標識,序列)以外的ID發生器。這不支持。

然後,如果我做

/** 
* MyApp\AppBundle\Entity\UserSelection 
* 
* @ORM\Table(name="user_selection",uniqueConstraints={@ORM\UniqueConstraint(name="unique", columns={"user_id", "selection_id"})}) 
* @ORM\Entity(repositoryClass="MyApp\AppBundle\Entity\UserSelectionRepository") 
*/ 
class UserSelection 
{ 

    /** 
    * @var integer $id 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="UUID") 
    */ 
    private $id; 

    /** 
    * @var integer $userId 
    * @ORM\Column(name="user_id", type="integer") 
    */ 
    private $userId; 

    /** 
    * @var integer $selectionId 
    * @ORM\Column(name="selection_id", type="integer") 
    */ 
    private $selectionId; 
} 

當我運行生成的轉儲-SQL

ALTER TABLE user_selection ADD PRIMARY KEY (id); 

我得到

重複條目 '0' 鍵 'PRIMARY'

因此,就最佳實踐而言,進行的方式是什麼?

更新

所以我可以做這個工作,但它需要兩個步驟。首先,創建一個$ id列

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

運行ALTER TABLE user_selection ADD id INT NOT NULL;

然後,按以下順序,

/** 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
* @ORM\Id 
*/ 
private $id; 

將會產生ALTER TABLE user_selection CHANGE id id INT AUTO_INCREMENT NOT NULL, ADD PRIMARY KEY (id);

有沒有辦法讓所有的結合這在對實體的更改是單個dump-sql命令之後所需要的?

+1

如果你在2D解決方案使用自動增量ID而不是UUID之一?看來ALTER不起作用,因爲它不知道哪個UUID對現有記錄有影響。 (你也可以嘗試添加一個簡單的「id」列,用UUID填充它,然後修改表格以使用它作爲主鍵) – Veve

+0

@Veve我試過並得到「只能有一個自動列,它必須是定義爲一個關鍵「。然而,它似乎填充正確,有些時候我正在嘗試各種配置...我會嘗試複製它 – Windowpane

+0

@Veve是我可以使它工作,但它需要兩個步驟 – Windowpane

回答

1

UUID默認情況下是不是整數值,所以你的實體應該是這樣的

/** 
* MyApp\AppBundle\Entity\UserSelection 
* 
* @ORM\Table(name="user_selection",uniqueConstraints={@ORM\UniqueConstraint(name="unique", columns={"user_id", "selection_id"})}) 
* @ORM\Entity(repositoryClass="MyApp\AppBundle\Entity\UserSelectionRepository") 
*/ 
class UserSelection 
{ 

    /** 
    * @ORM\Column(type="guid") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="UUID") 
    */ 
    private $id; 

    /** 
    * @var integer $userId 
    * @ORM\Column(name="user_id", type="integer") 
    */ 
    private $userId; 

    /** 
    * @var integer $selectionId 
    * @ORM\Column(name="selection_id", type="integer") 
    */ 
    private $selectionId; 
} 
+0

所以SQL是'ALTER TABLE user_selection ADD id VARCHAR(255)NOT NULL COMMENT'(DC2Type:guid)',ADD PRIMARY KEY(id)'並且我得到''重複條目''爲'PRIMARY'鍵'' – Windowpane

+0

嘗試將@ORM \ GeneratedValue(strategy =「UUID」)更改爲'@ORM \ GeneratedValue(strategy =「AUTO」)' –

+1

然後我得到'只能有一個自動列,並且它必須被定義爲一個密鑰' – Windowpane

相關問題