2015-11-02 92 views
2

我正在設計一個Symfony2應用程序,其中一個計算機實體與幾個硬件組件,即主板,CPU,磁盤,MemoryModule等等相關聯。他們都是在學說中由實體代表的。Symfony2/Doctrine:如何在同一個集合中添加更多相同的實體?

如果在硬件配置中有多個相同的磁盤,我需要做的是將多個磁盤關聯到同一臺計算機。我想,以避免像磁盤1,磁盤2等多個領域,所以我設置了兩個實體之間的多對多關係:

實體計算機

//... 

/** 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Components\Disk", inversedBy="computers") 
* @ORM\JoinTable(name="computers_disks") 
*/ 
protected $disks; 

實體磁盤

//... 
enter code here 
/** 
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Computers\Computer", mappedBy="disks") 
*/ 
protected $computers; 

例如,我在我的燈具中運行此代碼:

$testComputer = new Computer(); 
$cpu = $this->getReference('CPU-i3-1150'); 
$disk = $this->getReference('Disk-wd500blue'); 

//... 

$testComputer->setCpu($cpu);  // OK 
$testComputer->addDisk($disk);  // OK 
$testComputer->addDisk($disk);  // ERROR 

我得到的錯誤是,符合市場預期,完整性約束違規:

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

如何克服呢?我想我應該在連接表上添加一個索引,但我不知道這是否可能。

編輯:我也試過 - 只是爲了 - 與單向關係,相同的錯誤。

回答

3

你不能做你正在試圖用標準ManyToMany原則關係做什麼,因爲根據定義,這些關係是唯一的,即它們只保存兩個實體的獨特組合。

但是你可以使用它作爲一個兩個實體之間的「關聯」實體做到這一點:

class Computer { 
    /** 
    * @ORM\OneToMany(targetEntity="ComputerDisk", mappedBy="computer") 
    **/ 
    protected $computerDisks; 
} 

class ComputerDisk { 
    /** 
    * @ORM\ManyToOne(targetEntity="Computer", inversedBy="computerDisks") 
    * @ORM\JoinColumn(name="computer_id", referencedColumnName="id") 
    **/ 
    protected $computer; 

    /** 
    * @ORM\ManyToOne(targetEntity="Disk", inversedBy="computerDisks") 
    * @ORM\JoinColumn(name="disk_id", referencedColumnName="id") 
    **/ 
    protected $disk; 

} 

class Disk { 
    /** 
    * @ORM\OneToMany(targetEntity="ComputerDisk", mappedBy="disk") 
    **/ 
    protected $computerDisks; 
} 

這將是類似於一個多對多的關係,只是這中間的實體將被用來保持關係,它不必是唯一的。

在你的情況下,這個實體和磁盤之間的關係可能是單向的,因爲你可能不需要知道哪個計算機持有每個磁盤,所以磁盤實體中的字段和與此實體的ComputerDisk關聯中的反轉可中省略

這種方法的

一個優點是,這種關係可以容納額外的字段,所以你可以做這樣的事情有一個$diskBay場,其保持的盤

+0

非常感謝卡洛斯的位置,其實我在另一個問題上聽說過一個「喬伊班」。這非常有幫助。 我也想管理它在一個奏鳴曲管理形式,即有一個「添加磁盤」按鈕,但我想這不是微不足道的。 如果我爲此打開另一個問題,可能會更好嗎?你有什麼經驗嗎? – godzillante

+1

首先嚐試實現它,如果你沒有得到它的工作,打開一個不同的問題 –

相關問題