Руководство

База данных

Использование `Database`, QueryBuilder и транзакций.

Передайте Database в сервис

Оставьте HTTP на controller, а persistence перенесите в repository или сервис приложения. Зависимость Database передавайте через конструктор туда, где действительно находится работа с базой данных.

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 для чтения и записи

Для обычных CRUD-запросов table() — хороший старт. В документации используется нейтральная таблица articles со столбцами id, title и published.

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

Связанные записи объединяйте в транзакцию

Оборачивайте многошаговые записи в Database::transaction(), чтобы связанные изменения либо все успешно выполнялись, либо все откатывались.

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',
    ]);
});