[Symfony2] Enregistrement d'une entité inverse - Relation ManyToMany Bidirectionnelle
Bonjour,
Énoncé du problème :
Deux entités : Operation et User (FOSUserBundle)
Type de relation entre les entités : ManyToMany Bidirectionnelle
Ce qui fonctionne :
- Création d'une opération (opération immobilière) en lui affectant des utilisateurs.
- Affichage d'une opération : montre bien la liste des utilisateurs rattachés à l'opération,
- Affichage d'un utilisateur : montre bien la liste des opérations rattachées à l'utilisateur.
Le problème :
Lors de la création d'un utilisateur en lui affectant des opérations => l'utilisateur est bien créé mais les opérations ne s'enregistrent pas.
Ci-joint le code de la méthode ajouterUserAction() ainsi que celui des l'entités User et Operation , si vous voulez voir d'autres parties du code demandez-le moi :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public function ajouterUserAction() {
$userManager = $this->get('fos_user.user_manager');
$user = $userManager->createUser();
$form = $this->createForm(new UserType(), $user);
$request = $this->getRequest();
if ($request->getMethod() == 'POST') {
$form->bind($request);
if ($form->isValid()) {
$user->setEnabled(true);
$userManager->updateUser($user);
$this->get('session')->getFlashBag()->add('info', 'Utilisateur bien ajoutée');
return $this->redirect($this->generateUrl('assetreportmanager_voirUser', array('id' => $user->getId())));
}
}
return $this->render('AssetReportManagerBundle:ReportManager:ajouterUser.html.twig', array('form' => $form->createView(),));
} |
Code:
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
| namespace Asset\UserBundle\Entity;
use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Asset\ReportManagerBundle\Entity\Operation", mappedBy="users", cascade={"persist"})
*/
private $operations; // Ici commentaires prend un « s », car un article a plusieurs operations !
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->operations = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Add operations
*
* @param \Asset\ReportManagerBundle\Entity\Operation $operations
* @return User
*/
public function addOperation(\Asset\ReportManagerBundle\Entity\Operation $operations)
{
$this->operations[] = $operations;
return $this;
}
/**
* Remove operations
*
* @param \Asset\ReportManagerBundle\Entity\Operation $operations
*/
public function removeOperation(\Asset\ReportManagerBundle\Entity\Operation $operations)
{
$this->operations->removeElement($operations);
}
/**
* Get operations
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getOperations()
{
return $this->operations;
}
} |
Code:
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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
| namespace Asset\ReportManagerBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Asset\ReportManagerBundle\Entity\Operation
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Asset\ReportManagerBundle\Entity\OperationRepository")
*/
class Operation
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*
*/
private $id;
/**
* @var string $nom
*
* @ORM\Column(name="nom", type="string", length=255)
* @Assert\NotBlank()
*
*/
private $nom;
/**
* @var string $description
*
* @ORM\Column(name="description", type="string", length=255)
*
*
*/
private $description;
/**
* @ORM\OneToOne(targetEntity="Asset\ReportManagerBundle\Entity\Image", cascade={"persist", "remove"})
*/
private $image;
/**
* @ORM\ManyToMany(targetEntity="Asset\UserBundle\Entity\User", inversedBy="operations", cascade={"persist"})
*/
private $users;
public function __construct()
{
$this->users = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Add users
*
*
* @param Asset\UserBundle\Entity\User $users
*/
public function addUser(\Asset\UserBundle\Entity\User $user)
{
$this->users[] = $user;
$users->addOperation($this);
return $this;
}
/**
* Remove users
*
* @param Asset\UserBundle\Entity\User $users
*/
public function removeUser(\Asset\UserBundle\Entity\User $user)
{
$this->users->removeElement($user);
$users->removeOperation($this);
}
/**
* Get users
*
* @return Doctrine\Common\Collections\Collection
*/
public function getUsers() // Notez le « s », on récupère une liste de catégories ici !
{
return $this->users;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set nom
*
* @param string $nom
* @return Operation
*/
public function setNom($nom)
{
$this->nom = $nom;
return $this;
}
/**
* Get nom
*
* @return string
*/
public function getNom()
{
return $this->nom;
}
/**
* Set description
*
* @param string $description
* @return Operation
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
/**
* Get description
*
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* @param Asset\ReportManagerBundle\Entity\Image $image
* @return Operation
*/
public function setImage(\Asset\ReportManagerBundle\Entity\Image $image = null)
{
$this->image = $image;
return $this;
}
/**
* @return Asset\ReportManagerBundle\Entity\Image
*/
public function getImage()
{
return $this->image;
}
} |
Merci de votre aide.
Ps: Je n'ai pas mis le sujet dans Doctrine2 car je ne sais pas si le problème vient de Doctrine2 ou de Symfony2 par exemple d'une mauvaise utilisation du FOSUserBundle.