2016-08-19 5 views
1

Update 01.09.2016 Ich habe mein Projekt aktualisiert: Ich habe benutzerdefinierte JoinColumn in meinen Entitäten losgeworden (jetzt ist es eine generiert, und mein Projekt funktioniert ohne Fehler). Und ich beschloss, verkürzen die Frage:ManyToOne ORM Assoziation in Doctrine mit benutzerdefinierten JoinColumn Name

Ist es gute Idee zu verwenden, um benutzerdefinierte Namen JoinColumn in ManyToOne unidirektionale Verbindung mit Symfony 2.7, Lehre 2.7?

Mein Fall war:


VieleipGroup Einheiten (viele IP-Adressen halten) sollten mit OneipGroupPrameters Entität zugeordnet werden. (Siehe Code unten)


Ich versuche, den Code in 3 Varianten (siehe 'Workflow'), und immer verschiedene Fehler auszuführen:

1). Keine Fehler, aber nur Füllen der ipGroupParams DB-Tabelle und nicht Einsetzen in eine beliebige ZeileipGroup Tabelle;

2). "Notice: Undefined index: ipGroupId" in vendor/Lehre/ORM/lib/Lehre/ORM/persisters/BasicEntityPersister.php in Zeile 685

$value = $newValId[$targetClass->fieldNames[$targetColumn]]; 

, die wirklich seltsam ist - $ target hat ipGroupId in fieldNames (wie Debugger zeigt);

3). (in dieser Variante sieht es so aus, als ob ich die besitzende Seite der Beziehung ändern würde) DBAL Ausnahme: Eine Ausnahme ist während der Ausführung von 'INSERT INTO ipGroup (ipgroupId, ip) VALUES (?,?)' mit params [null, "134.17. 26.129 "] ipGroupId kann nicht null sein. Und das ist Magie, weil ich setIpGroupId-Methode auf $ gObj anwenden, und es im RAM aktualisiert wird (ich sehe es im Debugger).

Der Workflow- ist:

public function createIpGroup() 
{ 
    $this->createParamsObj(); 
    $gObj = new \Bmw\StatBundle\Entity\ipGroup(); 
    $gObj->setIpGroupId($this->groupId); 
    $gObj->setIp($ip); 
    ### 1 variant 
    $gObj->setIpGroupParams($this->paramsObj); 
    ### 2 variant 
    $gObj->setIpGroupParams($this->paramsObj); 
    $this->em->persist($gObj); // if not rely on cascade persist 
    ### 3 variant 
    $this->paramsObj->addIpGroup($gObj); 
    $this->em->persist($this->paramsObj); 
    ### 
    $this->em->flush(); 
} 
public function createParamsObj() 
{ 
    $pObj = new \Bmw\StatBundle\Entity\ipGroupParams(); 
    $this->groupId = $this->container->get('my.id.generator')->generate(); 
    $pObj->setIpGroupId($this->groupId); 
    $this->em->persist($pObj); 
    $this->em->flush(); 
    $this->paramsObj = $pObj; 
} 

Hier initial Entitäten Code, - dann laufe ich doc: gen: Einheiten automatisch Getter und Setter zu erstellen:

/** 
* ipGroup 
* 
* @ORM\Table(
* uniqueConstraints={ 
* @UniqueConstraint(name="ip", columns={"ip"}), 
* @UniqueConstraint(name="userId", columns={"userId"}), 
* }, 
* indexes={@Index(name="ipGroupId", columns={"ipGroupId"})}, 
*) 
* @ORM\Entity 
*/ 
class ipGroup 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="ipGroupId", type="integer") 
    */ 
    private $ipGroupId; 

    /** 
    * @ORM\ManyToOne(targetEntity="ipGroupParams", inversedBy="ipGroup") 
    * @ORM\JoinColumn(name="ipGroupId", referencedColumnName="ipGroupId") 
    */ 
    private $ipGroupParams; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="ip", type="string", length=45, nullable=true) 
    */ 
    private $ip; 
} 

/** 
* ipGroupParams 
* 
* @ORM\Table(
* uniqueConstraints={ 
* @UniqueConstraint(name="ipGroupId", columns={"ipGroupId"}), 
* } 
*) 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks() 
*/ 
class ipGroupParams 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 


    /** 
    * @ORM\OneToMany(targetEntity="ipGroup", mappedBy="ipGroupParams", cascade={"persist", "remove"}, orphanRemoval=TRUE) 
    */ 
    private $ipGroup; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="ipGroupId", type="integer") 
    */ 
    private $ipGroupId; 
} 
+0

Frage: Haben Sie den Setter und den Getter der Entität generiert? –

+0

Yep, @GeraldChablowski, getters/setters generierten Code siehe [link] (https://docs.google.com/document/d/1c1V34ekmPbYfDGNAFfRgNVb8Tpvalmo3_dwpNO67NDI/edit?usp=sharing) – Parks

Antwort

0

Doktrin verknüpfen Sie nicht automatisch die beiden Objekte, aber speichern Sie sie in der gleichen Zeit aufgrund der persist.Das sollte funktionieren:

public function createIpGroup() 
{ 
    $this->createParamsObj(); 
    $gObj = new \Bmw\StatBundle\Entity\ipGroup(); 
    $gObj->setIpGroupId($this->groupId); 
    $gObj->setIp($ip); 
    $gObj->setIpGroupParams($this->paramsObj); 

    $this->paramsObj->addIpGroup($gObj); 

    $this->em->persist($gObj); 
    $this->em->flush(); 
} 
+0

Danke, aber es funktioniert nicht - genau so ** Variante2 **. Ich nehme auch an, dass das Fortbestehen automatisch auftritt, aufgrund von @OneToMany (..., cascade = {"persist", "remove"}, ...) Notation in ipGroupParams entity ... – Parks

+0

Ich habe es bearbeitet und $ gObj hinzugefügt -> setIpGroupId ($ this-> groupId) ;. Sollte jetzt funktionieren. –

+0

Entschuldigung, @GeraldChablowski, aber du hast keine Zeile hinzugefügt, du hast nur die 2. und 3. Variante kombiniert – Parks

Verwandte Themen