簡體   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