MBO-SD : De site voor software developer in het MBO
Relaties in je controller
Relaties in controllers
Relaties zijn binnen een Entity 'gewone' properties, je kan ze dus met Getters en Setters aanroepen of aanpassen.
In de eerste drie uitleggen, ManyToOne
, OneToMany
en ManyToMany
gebruiken
we het voorbeeld van Book
en Author
relaties. Bij de OneToOne
gebruiken
we de Order
met de Invoice
relaties.
OneToMany/ ManyToOne relatie ophalen/ tonen
In het voorbeeld (zie maken van relaties) hadden we in de entity Author
een relatie gelegd naar
boeken, een auteur kan meerdere boeken geschreven hebben. Bij het aanmaken hebben we toen aangegeven dat het
om een OneToMany gaat en de property hebben books
genoemd. (In het meervoud). In het onderstaande voorbeeld
hebben we een functie (method) in de BookController
die alle Auteurs ophaalt en in de Controller met een
dump()
methode informatie laat zien.
//In de use-space heb je in ieder geval de volgende regels staan
use App\Entity\Author;
use App\Entity\Book;
use Doctrine\ORM\EntityManagerInterface;
//In de Book Class in de controller staat deze functie
public function index(EntityManagerInterface $entityManager): Response
{
//Fetching one Author
$author = $entityManager->getRepository(Author::class)->find(1);
//Showing all of the books
foreach ($author->getBooks() AS $book) {
echo $book->getName(); //Showing the name of the book
}
}
Array
met alle boeken van de
Auteur met ID 1 in de database. Je kan als je wil ook weer door deze Array
heen lopen met een foreach
De auteur ophalen bij een boek
Om de auteur te tonen gebruik je de getProperty van de auteur, dit is als het goed is in het enkelvoud
->getAuthor()
op een book.
//In de use-space heb je in ieder geval de volgende regels staan
use App\Entity\Book;
use Doctrine\ORM\EntityManagerInterface;
//In de Book Class in de controller staat deze functie
public function index(EntityManagerInterface $entityManager): Response
{
//Fetching one Book with ID 1
$book = $entityManager->getRepository(Book::class)->find(1);
//Getting the correct Author
$author = $book->getAuthor();
//Show the name of the Author Entity
echo $author->getName();
}
Aanpassen van data (Setters)
Net als een getter
functie, heb je ook een setter
. Deze begint met het woordje
set, in plaats van get (duh).
De auteur is enkelvoud, je kan voor een auteur dus een Entity gebruiken in de setter.
$book = $entityManager->getRepository(Book::class)->find(1);
$author = $entityManager->getRepository(Author::class)->find(2);
$book->setAuthor($author);
Meerdere relatie ophalen in meerdere relaties
Soms heb je een relatie met meerdere relaties die je op wilt halen (bijvoorbeeld als je een ManyToMany gemaakt hebt. Dan krijg je een for-loop in een for-loop. Een voorbeeld hier van zijn recepten met ingredienten, een ingredient kan bij meerdere recepten gebruikt worden en meerdere recepten kunnen dezelfde ingredienten hebben. Zie onderstaand voorbeeld hoe je dit in de Controller zou kunnen tonen.
//In de use-space heb je in ieder geval de volgende regels staan
use App\Entity\Recipe;
use Doctrine\ORM\EntityManagerInterface;
//In de Book Class in de controller staat deze functie
public function index(EntityManagerInterface $entityManager): Response
{
//Fetching all the Recipes
$recipes = $entityManager->getRepository(Recipe::class)->findAll();
//Showing all of the books
foreach ($recipes AS $recipe) {
foreach ($recipe->getIngredients AS $ingredient) {
echo $ingredient->getName();
}
}
}