dans mon outil de gestion de cours je gère des semestres auxquels sont reliés des cours. Lorsque l'administration crée un nouveau semestre, j'aimerais lui offrir la possibilité de recopier les cours du semestre en cours, car parfois le planning ne change que très peu et ce serait dommage de tout resaisir à la main.
J'ai donc quelque chose comme ça :
Code : Tout sélectionner
Semestre 1,n <-------> 1,1 Cours 1,n <-------> 1,1 Compte-rendu
1,n <-------> 1,n Formateur
Voici mes entités.
Cours:
<?php
namespace Virgule\Bundle\MainBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Virgule\Bundle\MainBundle\Validator\Constraints as VirguleAssert;
/**
* Course
*
* @ORM\Table(name="course")
* @ORM\Entity(repositoryClass="Virgule\Bundle\MainBundle\Repository\CourseRepository")
* @VirguleAssert\CourseNotOverlapping
*/
class Course {
/**
* @ORM\ManyToOne(targetEntity="Semester", inversedBy="courses")
* @ORM\JoinColumn(name="fk_semester", referencedColumnName="id", nullable=false)
*/
protected $semester;
/**
* @ORM\ManyToMany(targetEntity="Teacher", inversedBy="courses")
* @ORM\JoinTable(name="teacher_course")
* @Assert\NotNull
*/
protected $teachers;
/**
* @ORM\OneToMany(targetEntity="ClassSession", mappedBy="course")
*/
protected $classSessions;
public function __clone() {
if ($this->id) {
$c = new Course();
$c->id = null;
$c->startTime = $this->startTime;
$c->endTime = $this->endTime;
$c->classRoom = $this->classRoom;
foreach($this->getTeachers() as $teacher) {
$c->addTeacher($teacher);
}
return $c;
}
}
}
Formateur:
<?php
namespace Virgule\Bundle\MainBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* Virgule\Bundle\MainBundle\Entity\Teacher
*
* @ORM\Table(name="teacher")
* @ORM\Entity(repositoryClass="Virgule\Bundle\MainBundle\Repository\TeacherRepository")
* @UniqueEntity(fields="username", message="Ce nom d'utilisateur est déjà pris")
* @UniqueEntity(fields="email", message="Cette adresse email est déjà utilisée")
*/
class Teacher extends BaseUser {
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Course", mappedBy="teachers", cascade={"persist"})
*/
private $courses;
}
La copie se passe bien pour les champs simples (heure de début, heure de fin etc) mais pour la relation avec les formateurs, elle est toujours vide, rien n'est sauvegardé dans ma table de relation.J'ai à peu près tout essayé: surcharger la méthode clone, mettre "cascade=persist" d'un côté ou de l'autre, ajouter le cours dans $cours côté formateur, ou ajouter le formateur dans $teachers côté cours, les deux à la fois, j'en suis à ça et toujours rien :
public function copyCourses($courseIds, $newSemester) {
$courses = $this->getRepository()->findByIds($courseIds);
foreach($courses as $course) {
$newCourse = clone $course;
$newCourse->setSemester($newSemester);
$newCourse->removeAllClassSessions();
$this->em->persist($newCourse);
$this->em->flush();
foreach($course->getTeachers() as $teacher) {
$teacher->addCourse($newCourse);
$this->em->persist($teacher);
$this->em->flush();
}
}
}
La méthode copy n'est pas implémentée dans Doctrine 2 : http://www.doctrine-project.org/api/orm ... ml#722-738Je ne comprends pas ça me paraît pourtant simple.
Merci de votre aide !