我正在尝试创建一个具有 2 个字段(都是 ManyToOne 字段)的 UniqueEntity。
代码如下:
/*
* @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;
目标是确保我只有一个将用户与连接链接的实体。
我应该在我的@UniqueEntity
声明中写其他东西吗?
我知道只有当一条记录的用户和连接字段在数据库中的其他记录中重复时,您才希望收到错误。
@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
{
另一方面,如果你在每个属性中声明@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
{.......
取自我系统上的实体。这种方式会影响数据库架构。看看我把@'ORM'UniqueConstraint annotation
放在哪里.对不起@estopero...下次我必须先阅读其他答案。
您也应该在属性注释中添加唯一声明。
/**
* @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文档和这个StackOverflow答案。