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_id
NULL
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);
}
$ address-> setClient ($ client) wird nicht aufgerufen. Passen Sie Client :: addAddress entsprechend an. – Cerad
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? –
Die Magie der Reflexion. Doctrine arbeitet direkt mit den Instanzdaten. Ich bin mir nicht sicher über den Serializer, aber es sieht genauso aus. – Cerad