Modellen & database
De datalaag van TubePress: modelklassen, de PDO Database-helper, prepared statements, het databaseschema en geversioneerde SQL-migraties uitgelegd.
TubePress communiceert met MySQL/MariaDB via twee dunne lagen: modellen (één statische klasse per entiteit) en de Database helper (een kleine wrapper rond PDO). Er is geen ORM en geen query builder om te leren — alleen prepared statements en voorspelbare methodenamen.
De modellaag
Elke kernentiteit heeft een model in src/Models/ met statische methoden. De beschikbare modellen zijn Video, Category, Tag, Performer, Channel, Comment, Page, User, Setting, Favorite, History, Report, ContactMessage, MenuConfig en FooterConfig.
$video = Video::find($id); // one row (or null)
$latest = Video::all(['status' => 'published', 'limit' => 20]);
$id = Video::create($data); // returns new id
Video::update($id, ['title' => 'New title']);
Video::delete($id);Modellen bevatten de joins en filters die specifiek zijn voor hun entiteit — zo geeft Video::find() de video terug met bijbehorende categorieën, tags, performers en kanalen, zodat controllers en templates eenvoudig blijven.
De Database helper
Voor alles wat een model niet al dekt, gebruik je de Database helper direct. Elke methode gebruikt prepared statements — voeg gebruikersinput nooit samen in SQL.
| Methode | Geeft terug | Doel |
|---|---|---|
Database::fetchOne($sql, $params) | array\|null | Eerste overeenkomende rij. |
Database::fetchAll($sql, $params) | array | Alle overeenkomende rijen. |
Database::insert($table, $data) | int | Voeg een associatieve array in; geeft het nieuwe id terug. |
Database::update($table, $data, $where, $whereParams) | int | Bijwerken; geeft het aantal gewijzigde rijen terug. |
Database::delete($table, $where, $params) | int | Verwijderen; geeft het aantal gewijzigde rijen terug. |
Database::count($table, $where, $params) | int | Aantal rijen. |
Database::query($sql, $params) | PDOStatement | Elke instructie, voor volledige controle. |
Database::transaction($callback) | mixed | Voer een closure uit in een transactie (automatisch commit/rollback). |
$rows = Database::fetchAll(
"SELECT * FROM videos WHERE status = ? ORDER BY id DESC LIMIT ?",
['published', 20]
);
$newId = Database::insert('categories', [
'name' => 'Amateur',
'slug' => 'amateur',
]);utf8mb4, echte prepared statements (geen emulatie) en de uitzonderingsfoutmodus, en maakt automatisch één keer opnieuw verbinding bij een echte "server has gone away"-fout — zodat langlopende workers een inactieve MySQL-timeout overleven.Transacties
Omsluit schrijfbewerkingen in meerdere stappen zodat ze allemaal slagen of allemaal worden teruggedraaid:
Database::transaction(function () use ($videoId, $catIds) {
Database::delete('video_categories', 'video_id = ?', [$videoId]);
foreach ($catIds as $cid) {
Database::insert('video_categories', [
'video_id' => $videoId, 'category_id' => $cid,
]);
}
});Het schema
De database gebruikt een overzichtelijk, genormaliseerd MySQL-schema. De kerntabellen omvatten users, settings, categories, tags, performers, channels, videos en de koppeltabellen video_categories, video_tags, video_performers — plus comments, user_favorites, user_history, video_likes, pages, plugins, themes en migrations. Optionele subsystemen voegen hun eigen tabellen toe (importtaken, mediaopslagplaatsen, transcodetaken/-servers, advertentiezones/-spots, rapporten, feedbronnen, vertaaltabellen en meer) naarmate je ze inschakelt.
Migraties
Schemawijzigingen staan in sql/ als genummerde bestanden — 001_users.sql, 002_settings.sql, … — die in volgorde worden toegepast door Migrator::run() tijdens installatie en na elke update. Elke migratie is additief en wordt vastgelegd in de migrations-tabel zodat deze nooit twee keer wordt uitgevoerd.
- Om het schema uit te breiden vanuit een plugin, lever je je
CREATE TABLE-instructies mee en voer je ze uit in deinstall()-methode van de plugin (zie Hooks & plugins). - Hernummer of bewerk een toegepaste migratie nooit — voeg een nieuwe toe met een hoger nummer.
Een model schrijven
Een model is gewoon een statische klasse die de Database helper omhult voor één tabel:
class Promo
{
public static function current(): ?array
{
return Database::fetchOne(
"SELECT * FROM promos WHERE active = 1
ORDER BY id DESC LIMIT 1"
);
}
}Volgende stappen
Nog vastgelopen?
Open een ticket vanuit uw dashboard en ons team helpt u verder.