7

我正在尝试创建一个具有 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;

目标是确保我只有一个将 USER 与 CONNECT 链接的实体。

我应该在@UniqueEntity声明中写其他内容吗?

4

3 回答 3

12

我知道只有当一条记录的用户连接字段在数据库中的另一条记录中重复时,您才希望得到一个错误。

@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 值,也会发生同样的情况。

于 2013-06-02T20:40:48.517 回答
6

这有效:

/**
 * 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 ...下次我必须先阅读其他答案。

于 2013-11-08T12:52:19.237 回答
-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;

请参阅此symfony 文档和此 StackOverflow答案

于 2012-11-08T15:37:24.333 回答