2012-06-11 43 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 ...下次我必须先阅读其他答案。