06 - Persistence, PDO
Cílem této hodiny je seznámit se s návrhovým vzorem ActiveRecord a persistencí v PHP pomocí PDO.
Teorie
Praktická část
- implementuje ukládání/načítání instancovaných objektů do/z databáze.
- vycházejte z návrhového vzoru active record.
- vytvořte statickou třídu, která bude reprezentovat přístup k databázi
- vytvořte abstraktní třídu AbstractModel, která v sobě bude mít implementovanou obecnou logiku pro ukládání a čtení záznamů z databáze.
- od této třídy budou dědit všechny doposud existující entitní třídy (Product, Order, Customer).
- příklad používání active record
<?php ... // create product $product = new Product("Tesla 3", 1_500_000); $product->save(); // get all products $products = Product::all(); // get specific product by its identifier $product = Product::find(1); // update product $product->setName("Toyota Corolla Cross"); $product->save(); // delete product $product->delete(); ...
- příklad základní struktury třídy AbstractModel:
<?php abstract class AbstractModel { /** @return AbstractModel[] */ public static function all(): ?array { // TODO: implement me } public static function find(int $id): ?AbstractModel { // TODO: implement me } public function save(): bool { // TODO: implement me } public function delete(): bool { // TODO: implement me } }
- DDL a testovací data pro tabulku produkt (SQLite)
drop table if exists product; create table product ( id INTEGER not null constraint product_pk primary key autoincrement, name TEXT not null, price REAL not null, vat_rate REAL not null ); insert into product (name, price, vat_rate) values ('Mitsubishi Lancer', 320000, 0.21), ('Škoda Octavia', 960000, 0.21), ('BMW 3 sedan', 1300000, 0.21);
- DDL a testovací data pro tabulku produkt (PostgreSQL, pokud používáte náš Docker)
drop table if exists product; create table product ( id serial constraint product_pk primary key, name text not null, price double precision not null, vat_rate double precision not null ); alter table product owner to dev; insert into product (name, price, vat_rate) values ('Mitsubishi Lancer', 320000, 0.21), ('Škoda Octavia', 960000, 0.21), ('BMW 3 sedan', 1300000, 0.21);