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