2015-04-29 1 views
4

Je CategoryOneToManyPost association dans la configuration de Doctrine2 comme ceci:Symfony2 JMSSerializerBundle entité deserialize avec l'association OneToMany

Catégorie:

... 
/** 
* @ORM\OneToMany(targetEntity="Post", mappedBy="category") 
* @Type("ArrayCollection<Platform\BlogBundle\Entity\Post>") 
*/ 
protected $posts; 
... 

Poste:

... 
/** 
* @ORM\ManyToOne(targetEntity="Category", inversedBy="posts") 
* @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
* @Type("Platform\BlogBundle\Entity\Category") 
*/ 
protected $category; 
... 

Je suis en train de désérialiser suivant objet json (les deux entités avec l'ID de 1 existent déjà dans la base de données)

{ 
    "id":1, 
    "title":"Category 1", 
    "posts":[ 
     { 
      "id":1 
     } 
    ] 
} 

en utilisant la méthode de désérialisation de JMSSerializerBundle sérialiseur configuré avec constructeur d'objet doctrine

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

avec le résultat suivant:

Platform\BlogBundle\Entity\Category {#2309 
    #id: 1 
    #title: "Category 1" 
    #posts: Doctrine\Common\Collections\ArrayCollection {#2314 
    -elements: array:1 [ 
     0 => Platform\BlogBundle\Entity\Post {#2524 
     #id: 1 
     #title: "Post 1" 
     #content: "post 1 content" 
     #category: null 
     } 
    ] 
    } 
} 

qui est bien à première vue. Le problème est que Post associé a category champ défini sur null, ce qui entraîne aucune association sur persist(). Si je tente de désérialiser ceci:

{ 
    "id":1, 
    "title":"Category 1", 
    "posts":[ 
     { 
      "id":1 
      "category": { 
       "id":1 
      } 
     } 
    ] 
} 

il fonctionne très bien mais ce n'est pas ce que je veux faire :(Je pense que la solution pourrait consister à inverser en quelque sorte l'ordre dans lequel les entités sont enregistrées si le poste a été acceptée. première et deuxième catégorie, cela devrait fonctionner.

Comment enregistrer cette association correctement?

Répondre

0

Je ne sais pas si cela est toujours pertinent pour vous, mais la solution est assez simple.

vous devez configurer un Accessor wit h un setter pour une association, par exemple .:

/** 
* @ORM\OneToMany(targetEntity="Post", mappedBy="category") 
* @Type("ArrayCollection<Platform\BlogBundle\Entity\Post>") 
* @Accessor(setter="setPosts") 
*/ 
protected $posts; 

Le sérialiseur va appeler la méthode setter pour remplir posts de json. Le reste de la logique doit être géré à l'intérieur du setPosts:

public function setPosts($posts = null) 
{ 
    $posts = is_array($posts) ? new ArrayCollection($posts) : $posts; 
    // a post is the owning side of an association so you should ensure 
    // that its category will be nullified if it's not longer in a collection 
    foreach ($this->posts as $post) { 
     if (is_null($posts) || !$posts->contains($post) { 
      $post->setCategory(null); 
     } 
    } 
    // This is what you need to fix null inside the post.category association 
    if (!is_null($posts)) { 
     foreach ($posts as $post) { 
      $post->setCategory($this); 
     } 
    } 

    $this->posts = $posts; 
}