API Reference

Auto-gegenereerd via Reflection — blijft altijd in sync met src/.

Filter: alleAppCacheCmsDbDebugDynamicEventsFilesFormHtmlHttpImageLogMediaSecuritySessionStdlibSupportView

Adapter

Framework\Db\Adapter
class

Dunne wrapper rond een PDO-connectie.

Doel: één plek voor de PDO-instance (kernel-service `$kernel->db`),
een transactional helper, en een `into:`-parameter zodat queries direct
een specifieke klasse of callable als rij-prototype kunnen krijgen
(zoals legacy `Db\Adapter\PDO::query(..., ['prototype' => ...])`).

`query()` returnt een `PDOStatement` zodat alle native PDO-features
(`fetchAll`, `fetch`, foreach-iteratie, rowCount, errorInfo, …) gewoon
werken zonder extra abstractie-laag.

$db = new Adapter($pdo);

// stdClass per rij (PDO default na FETCH_OBJ in Bootstrap)
$rows = $db->query('SELECT * FROM users WHERE active = ?', [1])->fetchAll();

// Hydrate naar een klasse — PDO::FETCH_CLASS
$rows = $db->query($sql, $params, into: User::class)->fetchAll();

// Custom builder — PDO::FETCH_FUNC, perfect voor readonly objects
$rows = $db->query($sql, $params,
into: fn($id, $name) => new User(id: $id, name: $name)
)->fetchAll();

// Transactional block
$id = $db->transactional(fn() => $repo->insert([...]));

Voor query-timing/logging: wrap in `ProfilingAdapter` (zelfde interface).

__construct(PDO $pdo)
4 public methods
lastInsertId(): int
pdo(): PDO

Escape-hatch voor code die direct PDO nodig heeft.

query(string $sql, array $params = array ( ), callable|string|null $into = NULL): PDOStatement

Voer een query uit met optionele bind-params en optioneel rij-prototype.

transactional(callable $fn): ?mixed

Voer `$fn` uit binnen een transactie. Bij exception: rollback en re-throw.
Genest aanroepen wordt als no-op behandeld (de outer transactie wint).

Operator

Framework\Db\Operator
enum

Vergelijkings-operators voor {@see Query}.

Gevangen in een enum zodat de SQL-compiler een gesloten set kan
accepteren — geen string-injectie via een onbekende operator.

4 public methods
static cases(): array
static from(string|int $value): static
static from2(string $op): self

Resolve een loose string naar een case (case-insensitive, '<>' alias).

static tryFrom(string|int $value): ?static
Cases: Eq, NotEq, Lt, Lte, Gt, Gte, Like, NotLike, In, NotIn, IsNull, IsNotNull, Between

ProfilingAdapter

Framework\Db\ProfilingAdapter
final class

Adapter-decorator die elke query timed en via een PSR-3 logger logt.

$db = new ProfilingAdapter($pdo, $logger);
$db->query('SELECT 1');
// Log-line: "DB query (1.2ms) SELECT 1" met context [duration_ms, params]

Vervangt legacy `Db\Profiler` — die schreef naar eigen output, deze gaat
door dezelfde PSR-3 logger als de rest van het framework. Niveau is per
default DEBUG; te overriden via constructor.

Profiling stats (totaal-aantal queries, totale tijd) leven op het object;
`stats()` geeft 'm terug. Geen autoflush — caller bepaalt wanneer.

__construct(PDO $pdo, \LoggerInterface $logger, string $level = 'debug')
3 public methods
query(string $sql, array $params = array ( ), callable|string|null $into = NULL): PDOStatement
resetStats(): void
stats(): array

Query

Framework\Db\Query
final class

Fluent, immutable query-builder boven {@see TableRepository}.

Twee groeperings-stijlen:

// closure
->whereGroup(fn(Query $q) => $q->where('age', '>=', 18)->orWhere('parent', 1))

// nest()/unnest() — geleend van legacy/library/Db/Predicate
->nest()->where('age', '>=', 18)->orWhere('parent', 1)->unnest()

Beide produceren `(...)`-groeperingen in de SQL.

__construct(PDO $pdo, string $table, string $pk = 'id')
26 public methods
count(): int
delete(): int

Massa-delete binnen het filter. Gooit exceptie zonder filter; gebruik
`->deleteAll()` voor truncate-achtige actie.

deleteAll(): int
exists(): bool
first(): ?array
get(): array
limit(int $limit, int $offset = 0): static
nest(string $combiner = 'AND'): static

Open een nieuwe group; returned de inner Query. Sluiten met `unnest()`.

orNest(): static
orWhere(string $column, ?mixed $opOrValue, ?mixed $value = NULL): static
orWhereGroup(callable $build): static
orderBy(string $column, string $direction = 'asc'): static
paginate(int $page = 1, int $perPage = 20): array

Pagineer: returnt items + meta (page, perPage, total, totalPages, hasMore).

toSql(): array
unnest(): static

Sluit een nest af en returneer de parent met de child-children gekopieerd.

update(array $data): int

Massa-update binnen het filter. Gooit een exceptie wanneer er geen filter is —
gebruik `->updateAll($data)` om dat bewust te accepteren.

updateAll(array $data): int
where(string $column, ?mixed $opOrValue, ?mixed $value = NULL): static

where(col, value) → '='
where(col, op, value)

whereBetween(string $column, ?mixed $from, ?mixed $till): static
whereGroup(callable $build, string $combiner = 'AND'): static

Group via closure. De callback krijgt een verse Query en moet de
gebouwde Query returnen (omdat de builder immutable is).

->whereGroup(fn($q) => $q->where('age', '>=', 18)->orWhere('parent', 1))

whereIn(string $column, array $values): static
whereLike(string $column, string $pattern): static
whereNotIn(string $column, array $values): static
whereNotLike(string $column, string $pattern): static
whereNotNull(string $column): static
whereNull(string $column): static

Sql

Framework\Db\Sql
final class

Pure SQL-compiler. Krijgt geserialiseerde where-nodes binnen,
spuugt SQL-fragments uit met PDO-positional-params.

Geen DB-toegang; volledig testbaar.

6 public methods
static compileAssignments(array $data): array

SET-clausule voor UPDATE/INSERT.

static compileLimit(?int $limit, int $offset = 0): string
static compileOrderBy(array $orders): string

Bouw ORDER BY clausule. Accepteert ['col' => 'asc'|'desc'] map.

static compileWhere(array $nodes): array

Compileer een where-tree naar SQL + params.

Tree-structuur (gemaakt door Query):
['type' => 'leaf'|'group', ...]

leaf: ['type' => 'leaf', 'combiner' => 'AND'|'OR', 'column' => string,
'op' => Operator, 'value' => mixed]

group: ['type' => 'group', 'combiner' => 'AND'|'OR', 'children' => list<node>]

static quoteColumn(string $name): string
static quoteTable(string $name): string

TableRepository

Framework\Db\TableRepository
final class

Generieke repository voor "normale" tabellen — geen DynamicItems.

$members = new TableRepository($pdo, 'members');

$me = $members->find(42);
$id = $members->insert(['email' => 'jan@x.nl', 'name' => 'Jan']);
$members->update(42, ['name' => 'Jan Jansen']);
$members->delete(42);

$rows = $members->query()
->where('active', 1)
->whereIn('country', ['nl', 'be'])
->orderBy('name')
->limit(20)
->get();

$page = $members->query()->where('active', 1)->paginate(page: 2, perPage: 20);

Veldnamen worden gevalideerd via {@see Sql::COLUMN_REGEX} (anti-injection).
Optioneel `->columns([...])` om verder strikt te whitelisten.

Events (alleen wanneer `EventDispatcherInterface` is geïnjecteerd):
- BeforeInsertEvent / AfterInsertEvent
- BeforeUpdateEvent / AfterUpdateEvent
- BeforeDeleteEvent / AfterDeleteEvent

__construct(PDO $pdo, string $table, string $pk = 'id', ?\EventDispatcherInterface $events = NULL)
11 public methods
columns(array $columns): self

Schakel een strikte kolom-whitelist in.

countBy(array $criteria = array ( )): int
delete(string|int $id): bool
find(string|int $id): ?array
findBy(array $criteria, ?int $limit = NULL): array
findOneBy(array $criteria): ?array
insert(array $data): string|int
query(): \Query
transactional(callable $fn): ?mixed

Roep $fn aan binnen één PDO-transactie. Bij exception → rollback.

update(string|int $id, array $data): bool
upsert(array $data, array $on): string|int

AfterDeleteEvent

Framework\Events\Db\AfterDeleteEvent
final class
__construct(string $table, string|int $id, int $affected)

AfterInsertEvent

Framework\Events\Db\AfterInsertEvent
final class
__construct(string $table, string|int $id, array $data)

AfterUpdateEvent

Framework\Events\Db\AfterUpdateEvent
final class
__construct(string $table, string|int $id, array $data, int $affected)

BeforeDeleteEvent

Framework\Events\Db\BeforeDeleteEvent
final class
__construct(string $table, string|int $id)

BeforeInsertEvent

Framework\Events\Db\BeforeInsertEvent
final class

Gefired vóór een TableRepository::insert(). Listeners mogen `$data` muteren
via setData() — handig voor tijdstempels of audit-velden.

__construct(string $table, array $data)
2 public methods
getData(): array
setData(array $data): void

BeforeUpdateEvent

Framework\Events\Db\BeforeUpdateEvent
final class
__construct(string $table, string|int $id, array $data)
2 public methods
getData(): array
setData(array $data): void