Database en de EntityManager

De database/ ORM en Doctrine

In de basis van PHP heb je geleerd om een verbinding te maken met een database met opties als PDO of MySQLI. De connectie en afhandelingen met de database met Symfony gebeurt met Doctrine.
Binnen Symfony werken we met Doctrine als ORM oplossing. ORM staat voor Object-relation mapping, ofwel een manier om data tussen een database en object georienteerd programmeren te regelen.
In het kort regelt Symfony via de ORM de connectie tussen de database en de Models/ Entities.

De EntityManager

Om die connectie goed te regelen heeft Symfony een package genaamd de EntityManager. Als je in jouw functie de EntityManager aanroept als parameter kan je deze gebruiken om informatie op te halen of op te slaan met de Entities.
Als je met data uit de database wilt werken moet je als eerste de EntityManager in de use space zetten van je Controller.
use Doctrine\ORM\EntityManagerInterface;
Je moet ook de gewenste Entity in de use space zetten, in het onderstaande voorbeeld werken we met de Book entity, in de use space zetten we dan ook
use App\Entity\Book;
als code neer.

Find en FindAll functies

Je kan met de EntityManager verschillende functies uitvoeren op een Entity-class. De voornaamste functies zijn findAll() en find($id).

Ophalen van alle rijen uit de database (findAll())

Om alle rijen op te halen uit de database kan je de ->findAll() functie gebruiken. In onderstaand voorbeeld halen we alle boeken op van de Book entity.

//In de use space staan in ieder geval de volgende zaken
use App\Entity\Book; //Inladen van de Book entity
use Doctrine\ORM\EntityManagerInterface; //Gebruik maken van de EntityManager voor de database connectie

//Verder op in de BookController staat de volgende code
#[Route('/book', name: 'app_book')]
public function index(EntityManagerInterface $entityManager): Response
{
    //Ophalen van alle boeken
    $books = $entityManager->getRepository(Book::class)->findAll();

    //Tonen van de juiste view (renderen)
    return $this->render('book/index.html.twig', [
        'books' => $books
    ]);
}

Ophalen van een rij uit de database (findAll())

Veelal wil je ook maar 1 rij op halen, omdat je die wilt tonen of bewerken. Dit kan je doen met de ->find($id) functie van de EntityManager. De $id is de variabele van de ID die je wilt ophalen uit de database.
In de route geef je dan een parameter mee die je op wilt halen of tonen.
Dit kan je doen door in de Route aan te geven dat je een parameter hebt door (met het voorbeeld van book) het tussen accolades te zetten {book}
Deze parameter geef je ook als parameter mee in de functie $book. Zie onderstaand voorbeeld.

//In de use space staan in ieder geval de volgende zaken
use App\Entity\Book; //Inladen van de Book entity
use Doctrine\ORM\EntityManagerInterface; //Gebruik maken van de EntityManager voor de database connectie

//Verder op in de BookController staat de volgende code waarbij {book} het gewenste boek is
//en als $book terug komt als parameter in de functie
#[Route('/book/show/{book}', name: 'app_show_book')]
public function index(EntityManagerInterface $entityManager, $book): Response
{
    //Ophalen van het gewneste boek uit de database
    $books = $entityManager->getRepository(Book::class)->find($book);

    //Tonen van de juiste view (renderen)
    return $this->render('book/show.html.twig', [
        'book' => $book
    ]);
}

Entity casting op de juiste Entity

In Symfony kan je in plaats van gebruik te maken van de juiste EntityManager ook gebruik maken van Entity casting, hierbij wordt direct de juiste Entity opgehaald.

//In de use space staan in ieder geval de volgende zaken
use App\Entity\Book; //Inladen van de Book entity
use Doctrine\ORM\EntityManagerInterface; //Gebruik maken van de EntityManager voor de database connectie

//Verder op in de BookController staat de volgende code
#[Route('/book/show/{book}', name: 'app_show_book')]
public function index(Book $book): Response
{
    //Je hoeft nu Book niet op te halen via de EntityManager, het is ingeladen via de casting oplossing.

    //Tonen van de juiste view (renderen)
    return $this->render('book/show.html.twig', [
        'book' => $book
    ]);
}