Documentation · Chapitre 07

Lire et écrire
avec des objets PHP.

DbContext représente une séance de travail avec la base. DbSet représente l’ensemble des entités d’un type.

Nous remplaçons le stockage temporaire de reading-list par SQLite, sans changer l’objectif de l’application.

Créez le contexte

src/Data/AppDbContext.php

phpaml — zsh
namespace App\Data;

use AML\Data\{DbContext, DbSet};
use App\Models\Book;

final class AppDbContext extends DbContext
{
    /** @return DbSet<Book> */
    public function books(): DbSet
    {
        return $this->set(Book::class);
    }
}

Les quatre opérations fondamentales

phpaml — zsh
// Create
$book = new Book();
$book->title = 'The Pragmatic Programmer';
$book->author = 'Andrew Hunt & David Thomas';
$db->books()->add($book);

// Read
$books = $db->books()->orderBy('title')->all();
$book = $db->books()->find(1);

// Update
$book->title = 'New title';
$db->books()->update($book);

// Delete
$db->books()->remove($book);

Les valeurs sont envoyées comme paramètres à PDO; elles ne sont pas concaténées dans le SQL. DbSet limite aussi les opérateurs de recherche et valide les noms de colonnes issus des métadonnées.

Le suivi des changements

phpaml — zsh
$book = $db->books()->find(1);
$book->title = 'Domain-Driven Design';

$count = $db->saveChanges(); // 1

Une entité lue par le contexte possède un instantané. saveChanges() compare l’objet courant, détecte sa modification et exécute toutes les écritures dans une transaction.

Filtrer et paginer

phpaml — zsh
$page = $db->books()
    ->where('author', 'LIKE', '%Martin%')
    ->orderBy('title', 'asc')
    ->paginate(page: 1, perPage: 20);

where(), orderBy() et limit() retournent un nouvel objet de requête : la requête d’origine n’est pas modifiée. paginate() fournit les éléments, le total et les informations de page.