Les 5: Database & Doctrine
HomeLes 5

🗄️ Database & Doctrine

⏱ Geschatte leestijd: 35 minuten · 6 stappen

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

class Product
int $id
string $naam
float $prijs

Database tabel: product

idnaamprijs
1Laptop Pro999.99
2iPhone 15849.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.

Terminal
# 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:

src/Entity/Product.php
<?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".

src/Controller/ProductController.php
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.

src/Controller/ProductController.php
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?

SELECT * FROM product

5 Data bijwerken en verwijderen (Update & Delete)

Update: bijwerken
// 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=...
Delete: verwijderen
// 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().

src/Controller/SmartphoneController.php
Klik op "Controleer" om je code te testen...

📋 Samenvatting

  • Een Entity is een PHP-klasse die één databasetabel vertegenwoordigt
  • make:entitymake:migrationdoctrine:migrations:migrate maakt 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!