Le garde-manger

Exercice 3 sur 6 du chapitre 8 · 260 XP · 5 objectifs vérifiés par des tests

Notions abordées : ManyToManyCôté propriétaireCôté inverse#[ORM\OrderBy]Table de jointure

Bruna veut afficher les ingrédients de chaque plat : les voyageurs ont des allergies, et le Piment de feu a déjà envoyé un nain à l'infirmerie. Pipin a commencé : l'entité Ingredient existe, et il a écrit la commande qui range le garde-manger, app:garnir-les-plats. Il ne reste qu'à relier tout ça.

Un plat contient plusieurs ingrédients, et un ingrédient (le Miel, la Farine…) entre dans plusieurs plats : c'est une relation plusieurs-à-plusieurs. En base, elle se range dans une table de jointure qui contient une ligne par couple plat-ingrédient.

Votre mission

  1. Reliez Plat et Ingredient dans les deux sens : $plat->getIngredients() et $ingredient->getPlats().
  2. La commande de Pipin part de l'ingrédient ($ingredient->addPlat($plat)) : ce qu'elle range doit arriver en base.
  3. Les ingrédients d'un plat arrivent par ordre alphabétique.
  4. Générez la migration, relisez-la, jouez-la, puis lancez app:garnir-les-plats dans la console.
  5. Sur la fiche d'un plat, affichez ses ingrédients dans une liste <ul class="ingredients">, avec un <li> par ingrédient.

Qui décide ?

Dans une relation à double sens, Doctrine ne regarde qu'un seul côté pour écrire en base : le côté propriétaire. L'autre côté, le côté inverse (celui qui porte mappedBy), sert seulement à naviguer. Si on ne modifie que le côté inverse, les objets PHP ont l'air à jour, et pourtant rien n'est enregistré.