Jdi na navigaci předmětu

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);

Domácí úkol