Leitfaden

Datenbank

Verwendung von `Database`, QueryBuilder und Transaktionen.

Database in den Service injizieren

Lass den Controller HTTP behandeln und verschiebe Persistenz in ein Repository oder einen Anwendungsservice. Injiziere Database über den Konstruktor dort, wo die Datenbankarbeit tatsächlich hingehört.

example.php
<?php

declare(strict_types=1);

namespace App\Services;

use Lemonade\Framework\Database\Database;

final class ArticleRepository
{
    public function __construct(
        private readonly Database $db,
    ) {}
}

QueryBuilder für Lesen und Schreiben verwenden

Für gewöhnliche CRUD-Abfragen ist table() ein guter Einstieg. Die Dokumentation verwendet die neutrale Tabelle articles mit den Spalten id, title und published.

example.php
$articles = $this->db->table('articles')
    ->select(['id', 'title', 'published'])
    ->where('published', 1)
    ->orderBy('id', 'DESC')
    ->getArray();

Zusammengehörige Schreibvorgänge in eine Transaktion packen

Umschließe mehrstufige Schreibvorgänge mit Database::transaction(), damit zusammengehörige Änderungen entweder vollständig erfolgreich sind oder gemeinsam zurückgerollt werden.

example.php
$this->db->transaction(function (): void {
    $this->db->table('articles')->insert([
        'title' => 'New article',
        'published' => 1,
    ]);

    $this->db->table('article_audit')->insert([
        'event' => 'created',
    ]);
});