Bonjour à tous,

J'ai deux entités

Societe et Adresse avec une relation OneToMany qui les relient car une société peut avoir plusieurs adresses.

UserBundle\Entity\Societe

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
 
namespace UserBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
 
/**
 * Societe
 *
 * @ORM\Table(name="societe")
 * @ORM\Entity(repositoryClass="UserBundle\Repository\SocieteRepository")
 */
class Societe {
 
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
 
    /**     
     * @ORM\OneToMany(targetEntity="Adresse", mappedBy="societe", cascade={"persist","remove"})
     */
    private $adresses;
 
    public function __construct() {        
        $this->adresses = new ArrayCollection();
    }
 
}
UserBundle\Entity\Adresse

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
 
namespace UserBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * Adresse
 *
 * @ORM\Table(name="adresse")
 * @ORM\Entity(repositoryClass="UserBundle\Repository\AdresseRepository")
 */
class Adresse {
 
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
 
    /**
     * @ORM\ManyToOne(targetEntity="Societe", inversedBy="adresses", cascade={"persist"})
     * @ORM\JoinColumn(name="societe_id", referencedColumnName="id")
     */
    private $societe;
 
}
Je veux pouvoir gérer ces entités via Sonata Admin, j'ai donc créé une adminClass de Societe qui embarque une collection d'adresses.

UserBundle\Admin\SocieteAdmin

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
 
namespace UserBundle\Admin;
 
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use UserBundle\Form\AdresseType;
 
class SocieteAdmin extends Admin {
 
    /**
     * @param FormMapper $formMapper
     */
    protected function configureFormFields(FormMapper $formMapper) {
        $formMapper
        ->add('id', 'sonata_type_model_hidden')
        ->add('societeNom')
        ->add('societeNumClient')
                ->end()
                ->with('Adresses', array('collapsed' => true))
                ->add('adresses', 'collection', array(
                    'type' => new AdresseType(),
                    'allow_add' => true,
                    'prototype' => true,
                    'by_reference' => true,
        ))
                ->end()
 
        ;
    }
}
Tout cela me génère ça:

Nom : screen-sonata-admin-societe.jpg
Affichages : 289
Taille : 46,6 Ko

Comme vous le voyez, je peux créer une société et ajouter autant d'adresses que je veux en cliquent sur le petit "+".

Le problème c'est qu'une fois que j'ai validé mon formulaire, ça me créé bien les données correspondantes dans ma base de données, mais l'id de la colonne societe_id de la table adresse reste à null.

Nom : screen-mysql-table-adresse.jpg
Affichages : 299
Taille : 31,0 Ko

Ce qui veut dire que les deux entités ne sont pas liées.

J'ai cherché sur le web, je ne vois pas ce que je loupe, pour moi c'est une problème que beaucoup de personnes ont rencontrés donc je ne comprend pas où je fais l'erreur.

Merci de prendre le temps de me répondre.