Db
Jet sice obsahuje robustní ORM DataModel a v dobře navržené a napsané aplikaci je tedy potřeba použití SQL přímo potlačena. To ovšem neznamená, že je práce s SQL znemožněná. Naopak. I když použijete ORM, tak pro různé specifické úkoly je vnodhé, nebo nutné, použít přímo SQL. Jde například o různé analytické výstupy, náročné aktualizační skripty a tak dále. Nehledě nato, že Jet DataModel pochopitelně s databází také pracuje a tedy potřebuje nějaký unifikovaný backend.
Z toho důvodu Jet obsahuje relativně jednoduchou fasádu pro práci s databází Jet\Db. Ta momentálně jako backend využívá PDO, ale má několik dalších účelů:
- Začlenit práci s DB do celku a využít ostatních rysů systému jako je definice aplikační konfigurace, továrny aby práce s DB zapadala do celkové koncepce Jet.
- Vytvořit unifikovanou vrstvu, která případně v budoucnu umožní nahradit PDO něčím jiným, pokud přijde lepší řešení, či umožnit vývojářům vytvořit si vlastní backend s tím, že rozhraní zůstane vždy zachováno a tedy nebude nutné modifikovat aplikaci.
- Napojit práci s DB na Jet Profiler.
Praktické použití
Ukažme si rovnou jak se s Jet\Db pracuje. V rámci aplikační konfigurace můžete mít definováno minimálně jedno, ale klidně i více spojení na databázi. Před prací s SQL potřebujete získat instanci tohoto spojení. Spojením se myslí instance příslušného backendu + příslušná konfigurace. Dále už se spojením pracujete vlastně běžným způsobem:
$db = Db::get(); //Default connection
$db->execute('INSERT INTO some_table SET
name=:name,
age=:age',
[
'name' => 'Some Name',
'age' => 42
]);
$adults = $db->fetchAll('SELECT id, name, age FROM same_table WHERE age>18');
$erp_db = Db::get('erp_connection');
$bills = $erp_db->fetchAssoc(
query: 'SELECT * FROM bills WHERE invoice_date>=:date AND paid=0',
query_data: [
'invoice_date' => '2021-12-01'
],
key_column: 'invoice_number'
);
Přehled metod které můžete použít pro práci s SQL najdete u popisu rozhraní backendu Jet\Db_Backend_Interface.
Uspořádání
Konfigurace
Konfigurace Db vužívá systému aplikační konfugurace. Je tedy možné snadno implementovat věci jako je instalátor, nebo konfiguraci rozšiřovat o další parametry a tak dále. V rámci Jet\Db jsou pro práci s konfigurací určeny tyto třídy:
- Db_Config
Hlavní konfigurační definice. Nejedná se o definici konkrétního spojení, ale drží v sobě přehled definic spojení a informaci o tom, které spojení je bráno jako hlavní. - Db_Backend_Config
Abstraktní třída konfigurace backendu - tedy konkrétního spojení. - Db_Backend_PDO_Config
Třída definice konfigurace spojení na databázi pro výchozí backend PDO.
A aplikaci však není nutné a ani vhodné s těmito třídami operovat ve smyslu přímého vytváření jejich instancí. K tomu i v případě Jet\Db slouží příslušná továrna. Navíc v běžné aplikaci neexistuje nutnost se o konfiguraci jakkoliv starat (pokud tedy nevyvíjíte například nový instalátor).
Backend
Rozhraní backendu definuje Jet\Db_Backend_Interface a výchozí backend implementuje Jet\Db_Backend_PDO.
Stejně jako pro konfiguraci platí i pro backend fakt, že v aplikaci se nemusíte o tyto třídy starat a už vůbec ne přímo vytvářet nějaké instance. Spojení máte k dispozici přes metodu Jet\Db::get().
I s backendem se interně pracuje přes příslušnou továrnu. Máte tedy možnost snadno a transparentně zaměnit třídu Jet\Db_Backend_PDO za svou implementaci, pokud budete potřebovat.