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
    }
}
Code om alle boeken te tonen.
In het bovenstaande voorbeeld zal je een overzicht krijgen van een 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();
}
Voorbeeld van het tonen van de auteur bij een boek

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);
Voorbeeld van een setter met 1 Entity

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();
        }
    }
}
Een voorbeeld van een dubbele for-loop