[英]Symfony2/Doctrine: how to add more of the same entity in the same collection?
我正在設計一個Symfony2應用程序,其中計算機實體與幾個硬件組件(例如,主板,CPU,磁盤,MemoryModule等)相關聯。 它們都由“學說”中的實體表示。
我需要做的是將多個磁盤與同一台計算機關聯,以防其硬件配置中有多個相同的磁盤。 我想避免使用Disk1,Disk2等多個字段,因此我在兩個實體之間設置了ManyToMany關系:
實體計算機 :
//...
/**
* @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'
我該如何克服呢? 我想我應該以某種方式在聯接表上添加索引,但是我不知道是否有可能。
編輯 :我也嘗試了-只是為了-與單向關系,相同的錯誤。
您無法使用標准的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中的inversedby。
這種方法的優點之一是,該關系可以容納額外的字段,因此您可以執行諸如$diskBay
字段來保存磁盤位置的操作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.