Modeller ve veritabanı
TubePress veri katmanı: model sınıfları, PDO Database yardımcısı, hazırlanmış ifadeler (prepared statements), veritabanı şeması ve sürümlenmiş SQL geçişleri (migration) açıklanıyor.
TubePress, MySQL/MariaDB ile iki ince katman aracılığıyla iletişim kurar: modeller (her varlık için bir statik sınıf) ve Database yardımcısı (PDO üzerinde küçük bir sarmalayıcı). Öğrenilecek bir ORM veya sorgu oluşturucu yoktur — yalnızca hazırlıklı ifadeler ve öngörülebilir metot adları.
Model katmanı
Her çekirdek varlığın src/Models/ dizininde statik metodlar sunan bir modeli bulunur. Mevcut modeller şunlardır: Video, Category, Tag, Performer, Channel, Comment, Page, User, Setting, Favorite, History, Report, ContactMessage, MenuConfig ve 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);Modeller, kendi varlıklarına özgü birleştirmeleri ve filtreleri kapsüller — örneğin Video::find(), videoyu kategorileri, etiketleri, sanatçıları ve kanallarıyla birlikte döndürür; böylece denetleyiciler ve şablonlar sade kalır.
Database yardımcısı
Bir modelin kapsamadığı her şey için Database yardımcısını doğrudan kullanın. Her metot hazırlıklı ifadeler kullanır — kullanıcı girdisini asla SQL'e birleştirmeyin.
| Metot | Döndürür | Amaç |
|---|---|---|
Database::fetchOne($sql, $params) | array\|null | İlk eşleşen satır. |
Database::fetchAll($sql, $params) | array | Tüm eşleşen satırlar. |
Database::insert($table, $data) | int | İlişkisel bir dizi ekler; yeni kimliği döndürür. |
Database::update($table, $data, $where, $whereParams) | int | Günceller; etkilenen satır sayısını döndürür. |
Database::delete($table, $where, $params) | int | Siler; etkilenen satır sayısını döndürür. |
Database::count($table, $where, $params) | int | Satır sayısı. |
Database::query($sql, $params) | PDOStatement | Tam kontrol için herhangi bir ifade. |
Database::transaction($callback) | mixed | Bir işlem içinde kapanış çalıştırır (otomatik 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, gerçek hazırlıklı ifadeler (emülasyon yok) ve istisna hata modunu kullanır; gerçek bir "server has gone away" hatası durumunda otomatik olarak bir kez yeniden bağlanır — böylece uzun süreli çalışan işçiler boştaki MySQL zaman aşımından etkilenmez.İşlemler
Çok adımlı yazma işlemlerini tümünün başarılı olması veya tümünün geri alınması için sarmalayın:
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,
]);
}
});Şema
Veritabanı temiz, normalleştirilmiş bir MySQL şeması kullanır. Temel tablolar şunları içerir: users, settings, categories, tags, performers, channels, videos ve birleştirme tabloları video_categories, video_tags, video_performers — ayrıca comments, user_favorites, user_history, video_likes, pages, plugins, themes ve migrations. İsteğe bağlı alt sistemler, etkinleştirdikçe kendi tablolarını ekler (içe aktarma işleri, medya depolamaları, dönüştürme işleri/sunucuları, reklam bölgeleri/noktaları, raporlar, besleme kaynakları, çeviri tabloları ve daha fazlası).
Geçişler
Şema değişiklikleri sql/ dizininde numaralı dosyalar olarak bulunur — 001_users.sql, 002_settings.sql, … — kurulum sırasında ve her güncellemeden sonra Migrator::run() tarafından sırayla uygulanır. Her geçiş kümülatiftir ve migrations tablosuna kaydedilir, böylece hiçbir zaman iki kez çalışmaz.
- Şemayı bir eklentiden genişletmek için
CREATE TABLEifadelerinizi gönderin ve bunları eklentinininstall()metodunda çalıştırın (bkz. Kancalar & eklentiler). - Uygulanmış bir geçişi hiçbir zaman yeniden numaralandırmayın veya düzenlemeyin — daha yüksek numaralı yeni bir tane ekleyin.
Model yazma
Bir model, tek bir tablo için Database yardımcısını sarmalayan statik bir sınıftan ibarettir:
class Promo
{
public static function current(): ?array
{
return Database::fetchOne(
"SELECT * FROM promos WHERE active = 1
ORDER BY id DESC LIMIT 1"
);
}
}Sonraki adımlar
Hâlâ takıldınız mı?
Kontrol panelinizden bir destek talebi açın, ekibimiz size yardımcı olacaktır.