Doctrine is de database-laag van Symfony. In plaats van SQL te schrijven, werk je met PHP-objecten — Doctrine vertaalt die automatisch naar SQL-queries. Je leert in deze les hoe je een Entity maakt, data opslaat en ophaalt.
1 Wat is een Entity?
Een Entity is een PHP-klasse die één databasetabel vertegenwoordigt. Elke eigenschap van de klasse is een kolom in de tabel. Elk object van die klasse is één rij.
PHP Entity
Database tabel: product
| id | naam | prijs |
|---|---|---|
| 1 | Laptop Pro | 999.99 |
| 2 | iPhone 15 | 849.00 |
2 Een Entity aanmaken
Je kunt een Entity handmatig schrijven, maar de Symfony-console doet het werk voor je. Na het aanmaken stel je de velden in via de interactieve wizard.
# Maak een nieuwe Entity aan (wizard start op)
php bin/console make:entity Product
# Doctrine maakt de migratie (SQL-bestand)
php bin/console make:migration
# Voer de migratie uit (maakt de tabel aan)
php bin/console doctrine:migrations:migrate
Het resultaat is een PHP-klasse met Doctrine-attributen die de tabelstructuur beschrijven:
<?php
namespace App\Entity;
use App\Repository\ProductRepository;
use Doctrine\ORM\Mapping as ORM;
// Doctrine weet dat dit een tabel is
#[ORM\Entity(repositoryClass: ProductRepository::class)]
class Product
{
// Primaire sleutel, automatisch opgehoogd
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
// Tekstveld, maximaal 255 tekens
#[ORM\Column(length: 255)]
private ?string $naam = null;
// Decimaal getal
#[ORM\Column]
private ?float $prijs = null;
// Getters en setters worden automatisch gegenereerd
public function getId(): ?int { return $this->id; }
public function getNaam(): ?string { return $this->naam; }
public function setNaam(string $naam): static { $this->naam = $naam; return $this; }
public function getPrijs(): ?float { return $this->prijs; }
public function setPrijs(float $prijs): static { $this->prijs = $prijs; return $this; }
}
3 Data opslaan (Create)
Om een nieuw record op te slaan gebruik je de EntityManager. Je maakt een object aan, vult de velden in, en vertelt Doctrine: "sla dit op".
use Doctrine\ORM\EntityManagerInterface;
#[Route('/producten/nieuw', name: 'product_nieuw', methods: ['POST'])]
public function nieuw(EntityManagerInterface $em): Response
{
// Stap 1: maak een nieuw object aan
$product = new Product();
$product->setNaam('Laptop Pro');
$product->setPrijs(999.99);
// Stap 2: vertel Doctrine dit object bij te houden
$em->persist($product);
// Stap 3: voer de INSERT-query uit naar de database
$em->flush();
$this->addFlash('success', 'Product opgeslagen!');
return $this->redirectToRoute('product_index');
}
persist($object)
Vertelt Doctrine: "houd dit object in de gaten"
flush()
Stuurt alle wijzigingen als SQL naar de database
4 Data ophalen (Read)
Via de Repository van een Entity haal je data op. Symfony injecteert de repository automatisch in je controller.
use App\Repository\ProductRepository;
#[Route('/producten', name: 'product_index')]
public function index(ProductRepository $repo): Response
{
// Alle producten ophalen (SELECT * FROM product)
$producten = $repo->findAll();
// Één product op ID (SELECT * WHERE id = 5)
$product = $repo->find(5);
// Zoeken op een veld (SELECT * WHERE naam = 'Laptop')
$laptops = $repo->findBy(['naam' => 'Laptop']);
// Één resultaat op veld
$eersteProduct = $repo->findOneBy(['naam' => 'Laptop']);
return $this->render('product/index.html.twig', [
'producten' => $producten,
]);
}
🧪 Welke SQL genereert Doctrine?
5 Data bijwerken en verwijderen (Update & Delete)
// Haal het product op
$product = $repo->find($id);
// Pas het aan (geen persist() nodig — object is al bekend bij Doctrine)
$product->setNaam('Laptop Pro Max');
$product->setPrijs(1199.99);
// Sla op
$em->flush(); // UPDATE product SET naam=..., prijs=... WHERE id=...
// Haal het product op
$product = $repo->find($id);
// Markeer voor verwijdering
$em->remove($product);
// Voer de DELETE-query uit
$em->flush(); // DELETE FROM product WHERE id=...
6 Oefenen: schrijf een CRUD controller
Vul de ontbrekende delen in van de smartphone CRUD-controller. Gebruik $em->persist(), $em->flush() en $em->remove().
📋 Samenvatting
- ✓ Een Entity is een PHP-klasse die één databasetabel vertegenwoordigt
- ✓
make:entity→make:migration→doctrine:migrations:migratemaakt de tabel aan - ✓
$em->persist($obj)+$em->flush()slaat een nieuw object op (INSERT) - ✓
$repo->findAll()en$repo->find($id)halen data op (SELECT) - ✓
$em->remove($obj)+$em->flush()verwijdert een rij (DELETE)
Kennischeck
Test of je de stof begrepen hebt
Klaar met deze les? Markeer hem als voltooid!