MBO-SD : De site voor software developer in het MBO
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
]);
}