Lazy Loading je postup, kdy data nenahráváme ihned, ale až když jsou potřeba. Jak tento postup využít u jednoduchého ORM? V PHP stačí správně využít přetěžování:
<?php class ORM { protected $id; protected $table; protected $data = array(); function __construct($table, $id = null) { $this->table = $table; $this->id = $id; } function __get($name) { $this->load(); return $this->data[$name]; } function __isset($name) { $this->load(); return isset($this->data[$name]); } function __set($name, $value) { $this->data[$name] = $value; } function __unset($name) { unset($this->data[$name]); } protected function load() { if ($this->data) { return false; } if (isset($this->id)) { $this->data = mysql_fetch_assoc(mysql_query(" SELECT * FROM $this->table WHERE id = " . intval($this->id) . " ")); } else { $result = mysql_query("EXPLAIN $this->table"); while ($row = mysql_fetch_assoc($result)) { $this->data[$row["Field"]] = $row["Default"]; } mysql_free_result($result); } } function save() { $set = array(); foreach ($this->data as $key => $val) { $set[] = "$key = " . (isset($val) ? "'" . mysql_real_escape_string($val) . "'" : "NULL"); } if (isset($this->id)) { if (!$set) { return 0; } mysql_query(" UPDATE $this->table SET " . implode(", ", $set) . " WHERE id = " . intval($this->id) . " "); } else { mysql_query("INSERT INTO $this->table " . ($set ? "SET " . implode(", ", $set) : "() VALUES ()" )); $this->id = mysql_insert_id(); $this->data["id"] = $this->id; } return mysql_affected_rows(); } function delete() { if (isset($this->id)) { mysql_query("DELETE FROM $this->table WHERE id = " . intval($this->id)); $this->id = null; return mysql_affected_rows(); } return 0; } } ?>
Kód není myšlen jako kompletní ORM, ale jen jako ukázka toho, že data není nutné načítat dříve, než je to nezbytně nutné. SQL příkazy předpokládají, že v tabulce bude existovat Auto Increment sloupec s názvem id
. Tomuto záměru je kód podřízen, takže např. o neexistenci záznamu se dozvíme až v momentě, kdy se z něj pokusíme načíst hodnotu (a ne hned při vytvoření objektu) – je to kvůli aktualizacím, při kterých není potřeba původní záznam načítat. Ukázka použití:
<?php // vytvoření uživatele $uzivatel = new ORM("uzivatel"); $uzivatel->jmeno = "Jakub"; $uzivatel->save(); // načtení stávajícího uživatele $uzivatel = new ORM("uzivatel", 1); echo $uzivatel->jmeno; $uzivatel->jmeno = "Franta"; $uzivatel->save(); ?>
Diskuse je zrušena z důvodu spamu.