0

Ich habe 2 Entitäten Client und Address mit einer OneToMany Beziehung.
Wenn ich einen neuen Client mit einer Adresse erstelle, speichert er sowohl den Client als auch die Adresse, setzt aber client_id nicht auf die Adresse, sondern auf NULL.Symfony3 Zugehörige Entität, die bei der Erstellung nicht dem übergeordneten Objekt zugeordnet wurde

Ich verwende fosrestbundle und jmsserializer und sende die Daten als JSON-Objekt.

In meinem Controller habe ich folgendes:

/** 
* @REST\POST("/clients", name="create_client") 
*/ 
public function createClientAction(Request $request) 
{ 
    $serializer = $this->get('jms_serializer'); 
    $client = $serializer->deserialize($request->getContent(), 'AppBundle\Entity\Client', 'json'); 

    $em = $this->getDoctrine()->getManager(); 
    $em->persist($client); 
    $em->flush(); 

    return $this->view($client, 200); 
} 

Hier ist eine vereinfachte Anfrage Nutzlast:

{ "name" : "foo", "addresses" : [ { "zip" : "12345" } ] 

In meiner Datenbank es zusammen mit einem address mit zip = 12345 ein neues client mit name = foo schafft, jedoch ist das Feld client_idNULL

Meine Entitäten zugeordnet sind wie folgt:

//Client.php 
... 
... 
/** 
* @ORM\OneToMany(targetEntity="Address", mappedBy="client", cascade={"persist", "remove"}) 
*/ 
private $addresses; 

//Address.php 
... 
... 
/** 
* @ORM\ManyToOne(targetEntity="Client", inversedBy="addresses") 
* 
*/ 
private $client; 

Update

Ich bin jetzt noch mehr verwirrt, ich tun, nicht nur realisiert haben alle Getter/Setter in meine Entitäten, aber ich bin in der Lage zu erhalten/Daten setzen.

Ich rate setting hat etwas mit serializer->deserialize zu tun. Ich habe folgendes in meinen Diensten:

jms_serializer.object_constructor: 
    alias: jms_serializer.doctrine_object_constructor 
    public: false 

Und getting hat etwas mit dem fosrestbundle zu tun. Hier ist die Route planen:

/** 
* @REST\GET("/clients/{client}", name="get_client") 
*/ 
public function getClientAction(Request $request, Client $client) 
{ 
    return $this->view($client, 200); 
} 
+0

$ address-> setClient ($ client) wird nicht aufgerufen. Passen Sie Client :: addAddress entsprechend an. – Cerad

+0

Also fügen Sie '$ address-> setClient ($ this);' zu 'Client :: addAddress' hinzu? Ich habe das versucht und es schien keine Wirkung zu haben. Nebenbei bemerkte ich, dass ich keine Getter oder Setter für meine Adresse erstellt habe, aber es scheint immer noch die Daten zu bekommen/einzustellen. Also ging ich hinein und löschte die Getter/Setter für den Client und löschte meinen Cache. Ich bin immer noch in der Lage, Crud-Operationen an meinen Entitäten auszuführen. Ich bin mir nicht sicher, warum es die Getter/Setter nicht braucht ??? Ich vermute seinen Teil des jms_serializer/forestbundle. Irgendwelche Gedanken? –

+0

Die Magie der Reflexion. Doctrine arbeitet direkt mit den Instanzdaten. Ich bin mir nicht sicher über den Serializer, aber es sieht genauso aus. – Cerad

Antwort

0

Anscheinend musste ich merge und nicht persist das Unternehmen.

ich die Route aktualisiert:

$em = $this->getDoctrine()->getManager(); 
$em->merge($client); 
$em->flush(); 

und die Client Einheit:

/** 
* @ORM\OneToMany(targetEntity="Address", mappedBy="client", cascade={"persist", "remove", "merge"}) 
*/ 
private $addresses; 

scheint jetzt zu funktionieren!

Verwandte Themen