0

J'ai 2 entités Client et Address avec une relation de OneToMany.
Lorsque je crée un nouveau client avec une adresse, il enregistre à la fois le client et l'adresse mais ne définit pas le client_id sur l'adresse, il est NULL. J'utilise fosrestbundle et jmsserializer et j'envoie les données en tant qu'objet json.Entité associée Symfony3 non mappée au parent lors de la création

Dans mon contrôleur, je donne les résultats suivants:

/** 
* @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); 
} 

Voici une charge utile de demande simplifiée:

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

Dans ma base de données, il crée une nouvelle client avec name = foo avec un address avec zip = 12345, toutefois, le champ client_id est NULL

Mes entités sont mises en correspondance comme suit:

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

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

mise à jour

Je suis encore plus confus maintenant, je viens de réaliser que je n'ai pas getters/setters dans mes entités, mais je suis en mesure d'obtenir/définir des données. Je suppose que setting a un rapport avec serializer->deserialize. J'ai ce qui suit dans mes services:

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

Et getting a quelque chose à voir avec le fosrestbundle. Voici la route get:

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

$ adresse-> setClient ($ client) n'est pas appelé. Ajustez Client :: addAddress en conséquence. – Cerad

+0

Donc, fondamentalement, ajoutez '$ address-> setClient ($ this);' à 'Client :: addAddress'? J'ai essayé ça et ça n'a pas semblé avoir d'effet. Sur une note de côté, j'ai remarqué que je n'ai pas créé de getters ou setters pour mon adresse, mais il semble toujours obtenir/régler les données. Donc je suis entré et j'ai supprimé les getters/setters pour le client et j'ai vidé mon cache. Je suis toujours capable de faire des opérations crud sur mes entités. Je ne sais pas pourquoi il n'a pas besoin des getters/setters ??? Je devine sa partie du jms_serializer/fosrestbundle. Des pensées? –

+0

La magie de la réflexion. La doctrine opère directement sur les données d'instance. Je ne suis pas sûr du sérialiseur mais on dirait qu'il fait la même chose. – Cerad

Répondre

0

Apparemment, je devais merge et non persist l'entité.

I mis à jour la route:

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

et l'entité Client:

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

semble fonctionner maintenant!