Bonsoir à tous,

Je souhaite réaliser mon premier "ManyToMany" de la manière la plus simple qui soit mais je n'y parviens pas, même en suivant un tutoriel. :-/

J'ai une entité "Coproprietaire" qui contient juste un ID et une collection de lots : chaque lot peut-être attribué à plusieurs copropriétaires, donc ManyToMany.

Entité Copropriétaire :

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
 
namespace LogicielBundle\Entity\Copropriete;
 
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Entity\Traits\Identite;
 
/**
 * Coproprietaire
 *
 * @ORM\Table("copropriete_coproprietaire")
 * @ORM\Entity(repositoryClass="LogicielBundle\Repository\Copropriete\CoproprietaireRepository")
 */
class Coproprietaire
{
 
    use Identite;
 
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
 
    /**
     * @ORM\ManyToMany(targetEntity="LogicielBundle\Entity\Lot", cascade={"persist"})
     */
    private $lots;
 
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->lots = new ArrayCollection();
    }
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
 
    /**
     * Add lots
     *
     * @param \LogicielBundle\Entity\Lot $lots
     * @return Coproprietaire
     */
    public function addLot(\LogicielBundle\Entity\Lot $lots)
    {
        $this->lots[] = $lots;
 
        return $this;
    }
 
    /**
     * Remove lots
     *
     * @param \LogicielBundle\Entity\Lot $lots
     */
    public function removeLot(\LogicielBundle\Entity\Lot $lots)
    {
        $this->lots->removeElement($lots);
    }
 
    /**
     * Get lots
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getLots()
    {
        return $this->lots;
    }
}

Ensuite, dans mon controlleur, je fais appel à un formulaire permettant d'ajouter un nouveau lot, puisqu'on part du principe que le copropriétaire est déjà existant :

Controlleur (je vous épargne tout le code, mais le formulaire s'affiche correctement ) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
        $coproprietaire = $this->getCoproprietaire($id);
        $form = $this->createForm('logiciel_copropriete_coproprietaire_lot_form', $coproprietaire);
        $this->submit($form);
        if ($form->handleRequest($request)->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->flush();
            echo 'ok';
        }
Et enfin le formulaire en lui même, qui, comme vous l'avez peut-être vu, est appelé via. le service "logiciel_copropriete_coproprietaire_lot_form" :

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
35
36
37
38
39
40
41
42
43
44
45
<?php
 
namespace LogicielBundle\Form\Copropriete;
 
use LogicielBundle\Repository\LotRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
 
class CoproprietaireLotType extends AbstractType
{
 
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('lots', 'entity', array(
            'class' => 'LogicielBundle:Lot',
            'query_builder' => function(LotRepository $repository) {
                return $repository->getLotsForm('1');
            }
        ));
    }
 
    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'LogicielBundle\Entity\Copropriete\Coproprietaire',
            'intention' => $this->getName() . '_token'
        ));
    }
 
    /**
     * @return string
     */
    public function getName()
    {
        return 'logiciel_copropriete_coproprietaire_lot_form';
    }
}

Tout s'affiche correctement, y compris le formulaire. Mais lorsque je valide, je tombe sur cette erreur : " Neither the property "lots" nor one of the methods "addLot()"/"removeLot()", "setLots()", "lots()", "__set()" or "__call()" exist and have public access in class "LogicielBundle\Entity\Copropriete\Coproprietaire". " ; je ne comprends vraiment pas car comme vous le voyez, ces fonctions existent dans mon entité. :-/

Merci d'avance à ceux qui pourront m'aider