Ben*_*Ben 7 php doctrine many-to-one symfony doctrine-orm
我正在尝试创建一个包含2个字段的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;
Run Code Online (Sandbox Code Playgroud)
目标是确保我只有一个实体将USER与CONNECT链接起来.
我应该在@UniqueEntity宣言中写点什么吗?
小智 9
我知道只有当一个记录的用户和连接字段都在数据库中的其他记录中重复时,才会出现错误.
该@UniqueEntity注释是正确宣告你的目的(多列索引),但只有在表单验证被触发,并且不影响DDBB架构.
如果要在数据库级别添加相同的检查,则应在Table()声明中使用@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
{
Run Code Online (Sandbox Code Playgroud)
另一方面,如果在每个属性中声明@ORM\Column(unique = true),您将获得一个非常不同的行为,它将不是多列索引,但如果您输入两次,您将有两个独立的唯一列在同一个user_id中,您将获得与connect_id值无关的错误,如果输入两次相同的connect_id值,则会发生相同的错误.
这有效:
/**
* 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
{.......
Run Code Online (Sandbox Code Playgroud)
取自我系统上的实体.这种方式影响数据库架构.看看我放在哪里@\ORM\UniqueConstraint annotation.对不起@estopero ...下次我必须先阅读其他答案.
小智 -2
您也应该在属性注释中添加唯一声明。
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="userConnects")
* @ORM\Column(unique=true)
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity="Connect", inversedBy="userConnects")
* @ORM\Column(unique=true)
*/
private $connect;
Run Code Online (Sandbox Code Playgroud)
请参阅此symfony 文档和此 StackOverflow答案。