繁体   English   中英

Symfony2 / Doctrine:如何在同一集合中添加更多相同实体?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM