Symfony2 OneToOne关系成为唯一索引还是外键?

时间:2011-10-09 16:40:30

标签: foreign-keys doctrine-orm symfony entity-relationship unique-index

我正在Symfony2实体关系中迈出第一步。 我有一个实体安装,每个都有一米,还有一个显示器。

这转化为单向关系,我将其定义为:

    /**
     *
     * @ORM\OneToOne(targetEntity="InfoMeter")
     * @ORM\JoinColumn(name="meterid", referencedColumnName="id")
     */
    private $meter;  

    /**
     *
     * @ORM\OneToOne(targetEntity="InstallationsRtu")
     * @ORM\JoinColumn(name="monitorid", referencedColumnName="id")
     */
    private $monitor;

每个监视器只能分配给一个安装。 每个仪表可以分配给多个安装。

当我更新我的数据库(app / console doctrine:schema:update --force)时,有两个结果 如果是显示器:
一切顺利,架构使用以'UNIQ _'为前缀的键名更新。

如果是仪表: 我收到以下错误

PDOException]                                                                                             
  SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'UNIQ_43D26968860BE41D'

当我在发生此错误后查看表结构时,我找不到上述约束,但我确实找到FK_43D26968860BE41D,即相同,但前缀为'FK'。

在安装表中,我现在列出了这些:

Keyname                 Type    Unique  Packed  Field     Cardinality
PRIMARY                 BTREE   Yes No  id    2 
UNIQ_43D26968701EC1AB   BTREE   Yes No  monitorid 2     
FK_43D26968860BE41D BTREE   No  No  meterid   2

所以有人说'Unique = Yes',另一个说'Unique = No'。

得出我的问题:
我如何判断它是UNIQ指数还是FK指数? 我假设Doctrine看到当前每个monitorid在安装表中都是唯一的,但是每个meterid在安装表中都会多次出现。
因此,第一个是UNIQ,后者是FK。但我能以某种方式控制这个吗?

1 个答案:

答案 0 :(得分:4)

如果可以将一个metter分配给多个安装,那么您不应该定义OneToMany关系吗?

在您的安装实体中:

/**
 * @ORM\ManyToOne(targetEntity="InfoMeter", inversedBy="installations")
 * @ORM\JoinColumn(name="infometer_id", referencedColumnName="id")
 */
protected $info_meter;

然后在您的InfoMeter实体中:

/**
 * @ORM\OneToMany(targetEntity="Installation",mappedBy="info_meter")
 */
protected $installations;

此外,您应该将以下内容添加到InfoMeter类构造函数中:

function __construct() {
   [...]
   $this->installations = new \Doctrine\Common\Collections\ArrayCollection();
}

我确信这种方法可以改进,具体取决于你想要“安装”和“米”之间的关系,但这应该有效。