2016-07-29 9 views
0

Um a problem I had with variations of entities den schmutzigen Weg zu umgehen, versuche ich die Anzahl der verfügbaren Farben für eine Geräte-Reparatur zu beschränken. Die verfügbaren Farben dürfen die für das Gerät verfügbaren Farben nicht überschreiten. SoSymfony/Doctrine: Zugriff auf die Join-Tabellen?

ich habe:

Device.php

Diese ordnet das Gerät an die Farben und die zur Verfügung stehenden Reparaturen für dieses Gerät.

/** 
* @ORM\OneToMany(targetEntity="Repair", mappedBy="device", cascade={"remove"}) 
*/ 
private $repairs; 

/** 
* @ORM\ManyToMany(targetEntity="Color", inversedBy="devices") 
* @ORM\JoinTable(name="devices_colors", 
*  joinColumns={@ORM\JoinColumn(name="device_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="color_id", referencedColumnName="id")} 
*  ) 
*/ 
private $colors; 

Color.php

/** 
* @ORM\ManyToMany(targetEntity="Device", mappedBy="colors") 
*/ 
private $devices; 

Repair.php

Dies bildet einen Reparaturauftrag zu einem Gerät, sondern auch auf eine Farbe.

/** 
* @ORM\ManyToOne(targetEntity="Device", inversedBy="repairs") 
* @ORM\JoinColumn(name="device_id", referencedColumnName="id") 
*/ 
private $device; 

/** 
* @ORM\ManyToMany(targetEntity="Color") 
* @ORM\JoinTable(name="repairs_colors", 
*  joinColumns={@ORM\JoinColumn(name="repair_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="color_id", referencedColumnName="id")} 
*  ) 
*/ 
private $colors; 

RepairType.php

Punkt hier ist: dieses Feld Karte ‚Farben‘ auf die verfügbaren Farben in den Color Entity aber diese Entscheidungen beschränken, was für diese Instanz von Device verfügbar ist

Weil ich weiß, dass eine joins_colors Join-Tabelle erstellt wird, kann ich das gewünschte Ergebnis durch die folgende MySQL-Abfrage direkt erreichen y auf dem Server:

SELECT c.name FROM colors c LEFT JOIN devices_colors d ON (d.color_id=c.id) WHERE d.device_id = 1 

Allerdings erreichen meine oben genannten Versuche in RepairType nicht die gleichen Ergebnisse. Ich bekomme immer alle die verfügbaren Farben, nicht nur diejenigen, die auf Device gesetzt wurden. Was mache ich falsch?

Antwort

0

Ich fand eine Lösung. Zuerst habe ich die ManyToMany-Beziehungen (zwischen Farbe und Reparatur und zwischen Farbe und Gerät) bidirektional gemacht, indem ich die Eigenschaften devices und repairs der Einheit hinzugefügt habe.

Als nächstes schrieb ich meine query_builder Attribut als solche:

   'query_builder'=>function (EntityRepository $er) use ($device) { 
          return $er->createQueryBuilder('c') 
           ->join('c.devices','d','WITH','d = :device') 
           ->setParameter('device', $device); 
        } 

Das endete adaequat-ish. Aber es fühlt sich an wie ein schmutziger Hack für das Problem, das ich hatte.