Ga naar inhoud
TubePress — gratis, zelf gehost & actief onderhouden
Ontwikkelaarsreferentie

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.

MethodeGeeft terugDoel
Database::fetchOne($sql, $params)array\|nullEerste overeenkomende rij.
Database::fetchAll($sql, $params)arrayAlle overeenkomende rijen.
Database::insert($table, $data)intVoeg een associatieve array in; geeft het nieuwe id terug.
Database::update($table, $data, $where, $whereParams)intBijwerken; geeft het aantal gewijzigde rijen terug.
Database::delete($table, $where, $params)intVerwijderen; geeft het aantal gewijzigde rijen terug.
Database::count($table, $where, $params)intAantal rijen.
Database::query($sql, $params)PDOStatementElke instructie, voor volledige controle.
Database::transaction($callback)mixedVoer 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',
]);
Robuuste verbindingen. De helper gebruikt 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 de install()-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.

Probeer de live demo → TubePress downloaden →