Bonjour,
sous symfony 3.4.
j’ai une entity service liée en ManyToMany avec une entity agence
Une agence peut adhérer à plusieurs services et 1 service peut être adhérer par plusieurs agences.
J’ai aussi une entity user liée en ManyToMany avec l’entity service et en ManyToOne avec l’entity Agence.
1 User dépend d’une seule agence et il y a plusieurs users par agence.
1 User peut être attribué à plusieurs services et 1 services à plusieurs adhérants.
Enfin j’ai des plannings. 1 planning est lié en ManyToOne agence, ManyToONe service, il n’est pas lié à user.
Pour faire simple, j’ai créé une page pour les responsables d’agence, souhaitant souscrire/dé-souscrire à un service.
La question est, si un responsable dé-souscrit à un service pour son organisme, comment supprimer les liaisons avec user et planning de façon indolore?
Merci par avance
extrait de l’entity service
/**
* @ORM\OneToMany(targetEntity="Planning", mappedBy="service", cascade={"remove"})
* @ORM\JoinColumn(onDelete="CASCADE", onUpdate="CASCADE")
*/
private $plannings;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\User", mappedBy="services")
* @ORM\JoinColumn(onDelete="CASCADE", onUpdate="CASCADE")
*/
private $users;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Agence", mappedBy="services")
*/
private $agences;
extrait de user
/**
* @ORM\ManyToOne(targetEntity="Agence", inversedBy="users")
* @ORM\JoinColumn(nullable=false)
*/
private $agence;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Service")
*/
private $services;
extrait d’agence
/**
* @ORM\OneToMany(targetEntity="Planning", mappedBy="agence", cascade={"remove"})
*/
private $plannings;
/**
* @ORM\OneToMany(targetEntity="User", mappedBy="agence", cascade={"remove"})
*/
private $users;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Service", inversedBy="agences", cascade={"persist"})
*/
private $services;
extrait de planning
/**
* @var string
* @ORM\ManyToOne(targetEntity="Service", inversedBy="plannings"))
* @ORM\JoinColumn(nullable=false)
*/
private $service;
/**
* @var string
* @ORM\ManyToOne(targetEntity="Agence", inversedBy="plannings"))
* @ORM\JoinColumn(nullable=false)
*/
private $agence;
j’ai un palliatif, mais j’aurai souhaité gérer proprement depuis doctrine, c’est un peu barbare je trouve.
$services = $em->getRepository('AppBundle:Service')->findAll();
if(null != $request->request->get('service')){
foreach($services as $s){
if(!in_array($s->getId(), $request->request->get('service'))) {
$plannings = $em->getRepository('AppBundle:Planning')->findby(array('service'=>$s, 'agence'=>$agence));
foreach($plannings as $p){
$em->remove($p);
}
$users = $em->getRepository('AppBundle:User')->findby(array('agence'=>$agence));
foreach($users as $u){
$u->removeService($s);
$em->persist($u);
}
}
}
$em->flush();
}