[英]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.