>php bin/console make:entity
Liste des informations à fournir :
* Class name of the entity to create or update : Etudiant
* New property name : maison
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Maison", inversedBy="etudiants")
*/
private $maison;
.
Le getter et le setter de cette propriété ont été également implémentés :
public function getMaison(): ?Maison
{
return $this->maison;
}
public function setMaison(?Maison $maison): self
{
$this->maison = $maison;
return $this;
}
* Dans l'entité Maison, une propriété supplémetaire a été ajoutée :
/**
* @ORM\OneToMany(targetEntity="App\Entity\Etudiant", mappedBy="maison")
*/
private $etudiants;
Avec les getters et les setters et les méthodes d'ajout/suppression de liste
/**
* @return Collection|Etudiant[]
*/
public function getEtudiants(): Collection
{
return $this->etudiants;
}
public function addEtudiant(Etudiant $etudiant): self
{
if (!$this->etudiants->contains($etudiant)) {
$this->etudiants[] = $etudiant;
$etudiant->setMaison($this);
}
return $this;
}
public function removeEtudiant(Etudiant $etudiant): self
{
if ($this->etudiants->contains($etudiant)) {
$this->etudiants->removeElement($etudiant);
// set the owning side to null (unless already changed)
if ($etudiant->getMaison() === $this) {
$etudiant->setMaison(null);
}
}
return $this;
}
==== Réaliser le mapping avec le base de données : ====
Exécuter les instructions de mise à jour de la base de données
php bin/console make:migration
php bin/console doctrine:migrations:migrate
Un nouveau champ nommé maison_id a été créé. Il s'agit en plus d'une clé étrangère faisant référence au champ id de la table Maison.
==== Tests de la relation ManyToOne : ====
Pour tester la relation ManyToOne, nous allons récupérer une maison et l'ajouter à un étudiant.
Nous allons créer la nouvelle route permettant de modifier un étudiant :
Dans le fichier routes.yaml :
etudiantModifier:
path: /etudiant/modifier/{id}
controller: App\Controller\EtudiantController::modifierEtudiant
Dans le fichier EtudiantController, nous ajoutons la nouvelle méthode :
public function modifierEtudiant(ManagerRegistry $doctrine, $id){
//récupération de l'étudiant dont l'id est passé en paramètre
$etudiant= $doctrine->getRepository(Etudiant::class)->find($id);
if (!$etudiant) {
throw $this->createNotFoundException(
'Aucun etudiant trouvé avec le numéro '.$id
);
}
else
{
// récupération de la maison des griffondor à partir du code de la maison
$maison= $doctrine->getRepository(Maison::class)->findOneBy(['code' => 'SPT']);
if (!$maison) {
throw $this->createNotFoundException(
'Aucune maison trouvé avec ce nom'
);
}
else
{
//Affectation de la maison à l'étudiant
$etudiant->setMaison($maison);
// persistence de l'objet modifié
$entityManager = $doctrine->getManager();
$entityManager->persist($etudiant);
$entityManager->flush();
//return new Response('Etudiant : '.$etudiant->getNom());
return $this->render('etudiant/consulter.html.twig', [
'etudiant' => $etudiant,]);
}
}
}
http://localhost/webstudent/public/etudiant/modifier/4
==== Tests de la relation OneToMany: ====
Pour tester la relation OneToMany, nous allons récupérer une maison à partir du code qui sera passé en paramètre de l'url et lister tous les étudiants de cette maison.
Ajout de la route :
maisonConsulter:
path: /maison/consulter/{code}
controller: App\Controller\MaisonController::consulterMaison
Ajout du contrôleur et de la méthode consulterMaison :
class MaisonController extends AbstractController
{
/*
* @Route("/maison", name="maison")
*/
public function consulterMaison(ManagerRegistry $doctrine, $code){
$repository = $doctrine->getRepository(Maison::class);
$maison= $doctrine->getRepository(Maison::class)->findOneBy(['code' => 'SPT']);
return $this->render('maison/consulter.html.twig', ['pMaison' => $maison,]);
}
}
Création de la vue dans un nouveau dossier maison
Maison-consulter
BIENVENUE DANS LA MAISON DES {{ pMaison.nom | upper}}
id Nom Prénom datenaissance ville
{% for e in pMaison.etudiants %}
{{ e.id }}
{{ e.nom }}
{{ e.prenom }}
{{ e.dateNaiss|date('d/m/Y') }}
{{ e.ville}}
{% endfor %}
http://localhost/webstudent/public/maison/consulter/GFD
===== Relation Many-To-Many =====
Dans le contexte webstudent, il s'agit de la relation entre Competence et Professeur.
{{sfnmanytomany.png}}
==== Création de la relation avec la console : ====
Avec la commande permettant de générer les entités, nous pouvons créer la relation en renseignant les informations ci-dessous :
* Class name of the entity to create or update : Competence
* New property name : professeurs