【问题标题】:Symfony2 OneToOne relationship becomes either a Unique index or a foreign key?Symfony2 OneToOne 关系成为唯一索引还是外键?
【发布时间】:2011-12-04 00:46:06
【问题描述】:

我在 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;

每台显示器只能分配给一个安装。 每个仪表可以分配到多个安装。

当我更新我的数据库(应用程序/控制台原则:模式:更新 --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

所以一个说“唯一=是”,另一个说“唯一=否”。

回答我的问题:
如何确定它是 UNIQ 索引还是 FK 索引? 我假设 Doctrine 看到当前每个 monitorid 在安装表中都是唯一的,但每个meterid 在安装表中出现多次。
因此它与UNIQ一起用于第一个,FK用于后者。但我能以某种方式控制它吗?

【问题讨论】:

  • 这里完全是一个愚蠢的错误,是由于对 OneToOne 和 OneToMany 不清楚造成的。不过,为了以后的菜鸟,我要把它留在这里;)

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


【解决方案1】:

如果一个仪表可以分配给多个安装,你不应该定义一个 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();
}

我确信可以根据您希望“安装”和“计量”之间的关系如何改进这种方法,但这应该可行。

【讨论】:

  • 这是我在那儿犯的一个菜鸟错误。我认为“一个安装有一个仪表,所以 OneToOne”,但当然,“多个安装有一个相同的仪表”。但是,我会使其无方向性,因为我对“哪些装置与仪表 A 耦合”这样的信息不感兴趣。或者这是否违反了最佳实践?谢谢@alghimo!
猜你喜欢
  • 2011-04-17
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2011-09-16
  • 2012-01-02
相关资源
最近更新 更多