2

我正在采取Symfony2实体关系的第一步。 我有一个实体安装,每个都有一个仪表和一个监视器。Symfony2 OneToOne关系变成唯一索引还是外键?

这转化为单向关系,这是我定义为这样:

/** 
    * 
    * @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 

所以,一个说“独特=是”,而另一个说,“独特=否”。

为了达成我的问题:
我该如何判断它是UNIQ索引还是FK索引? 我认为Doctrine发现目前每个monitorid在安装表中都是唯一的,但是每个meterid在安装表中都会出现几次。
因此,它与UNIQ的第一个和FK的后者。但是,我能以某种方式控制它吗?

+0

这里是一个完全的noobish错误,由OneToOne和OneToMany不清晰造成的。尽管如此,我仍然会在这里留下它,为了未来的小菜鸟;) – Dieter

回答

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(); 
} 

我相信这种方法可以改进,这取决于你想要如何关系“装置“和”米“,但这应该起作用。

+0

这是我在那里做出的一个相当大的noob错误。我认为“一个装置有一米,所以OneToOne”,但是当然,“多个装置具有同一米”。 但是,我会让它变成单向的,因为在那里我没有兴趣知道“哪些装置与仪表A相连”。或者这是否与最佳实践不知何故?感谢@alghimo! – Dieter