2016-07-29 4 views
2

Ich habe eine Klasse Reparatur, die eindeutige Einträge für "Name", "Gerät" und "Farbe" haben sollte. I.e. es sollte nur einen "Ersatzbildschirm" für "iPhone 5c" in den Farben "rot" und "grün" geben.Lehre: UniqueEntity mit Many-to-Many Feld

Jedoch wirft Symfony eine Ausnahme:

Ausnahme beim ‚SELECT t0.id AS ID_1 Ausführung t0.name NAME_2 AS, AS t0.minutes minutes_3, t0.safetytime AS safetytime_4, t0.cost AS cost_5, t0.device_id AS device_id_6 FROM Reparatur t0 WHERE t0.name =? UND t0.device_id =? UND repairs_colors.color_id =? ' mit params [ "Ersetzen Bildschirm", 2, {}]:

Abfangbare Fatal Error: Objekt der Klasse Lehre \ ORM \ PersistentCollection nicht zu String umgewandelt werden konnte

Hier ist mein Entitätsdefinition (Repair.php):

/** 
* @ORM\Table(name="repair") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\RepairRepository") 
* @UniqueEntity(fields={"name", "device", "colors"}, message="There already exists a repair job with name {{ value }} for this device and these colours.") 
*/ 
class Repair { 

    /** 
    * @var string 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    private $name; 

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

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

ich verstehe, dass Symfony eine leere Palette von Farben eingestellt, anstatt den tatsächlichen Farben passiert. Aber warum?

+0

Mögest du verpasst werden müssen hinzufügen '__toString' Funktion in deiner' Color' Einheit –

Antwort

1

Here ist der Quellcode der UniqueEntity-Einschränkung in Symfony.

Als Standard Symfony wird internaly wie eine Abfrage tun:

->findBy(array(
'name'=>$entity->getName(), 
'device'=>$entity->getName(), 
'colors'=>$entity->getColors() // <- Precisely here, doctrine is not able to traduce that in a SQL query. 
)); 

Umgehung: Erstellen Sie Repository method besitzen, und es in der Einschränkung verwenden:

/** 
* @ORM\Table(name="repair") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\RepairRepository") 
* @UniqueEntity(fields={"name", "device", "colors"}, repositoryMethod="getSimilarRepairs") 
*/ 
class Repair { 
    // ... 
} 
+0

Hallo Elsässer, du bist der Typ aus dem ExtensiveEntityBundle! Danke, ich benutze das! Also verstehe ich, was Sie meinen, und ich versuche, meinen eigenen DQL-Repository-Code zu schreiben, ohne im Moment viel Erfolg zu haben. Aber ich frage mich, warum es bei 'getColors()' fehlschlägt? – bluppfisk

+0

Sorry aber ich weiß nicht genau warum es schief geht;) – Alsatian

Verwandte Themen