NotORM se výborně hodí pro pohodlné sestavování dotazů pokládaných do databáze, obzvlášť pokud potřebujeme pracovat se vztahy mezi tabulkami. Pokud je ale databáze navržena nešikovně nebo je příliš komplexní, tak by se hodilo nad nízkoúrovňovými funkcemi NotORM vytvořit ještě jednu vrstvu abstrakce.
Vezměme si třeba takové vícejazyčné záznamy. Pokud překlady uchováváme v samostatné tabulce, můžeme je pomocí NotORM získat následujícím kódem:
<?php // zjištění názvu a ceny produktu v dané skupině foreach ($notORM->product("group_id", $group) as $product) { foreach ($product->product_translation("language_id", $lang) as $product_translation) { $product_translation["name"]; } $product["price"]; } ?>
Kód je sice mnohem jednodušší, než při použití nízkoúrovňových funkcí, pořád je ale dost krkolomný. A to ani nezohledňuje případ, že by překlad neexistoval. Představa, že bych musel tento kód psát při každém získání přeloženého textu, mě zrovna neláká.
NotORM proto nyní (zatím pouze ve vývojové verzi) umožňuje určit třídu, ze které se budou vytvářet vracené řádky a která může chování upravovat. Třeba takhle:
<?php class NotORM_Row_Lang extends NotORM_Row { static $lang = "cs"; function offsetExists($offset) { if (substr($offset, -1) == "_") { $table = $this->result->table . "_translation"; // pokud by překlad neexistoval, vrátíme anglickou verzi foreach ($this->$table("language_id", array(self::$lang, "en"))->order("language_id = 'en'")->limit(1) as $row) { foreach ($row as $key => $val) { $this->row[$key . "_"] = $val; } } } return parent::offsetExists($offset); } function offsetGet($offset) { $this->offsetExists($offset); return parent::offsetGet($offset); } } ?>
Pro zjištění názvu a ceny výrobku pak lze psát skoro stejný kód, jako kdyby žádné překlady vůbec neexistovaly:
<?php // zjištění názvu a ceny produktu v dané skupině foreach ($notORM->product("group_id", $group) as $product) { $product["name_"]; $product["price"]; } ?>
Stejně jako bez rozšíření se položí pouze konstantní počet dotazů (v tomto případě dva).
Vracená třída se dá v současné době určit pouze globálně pro objekt třídy NotORM
, nicméně zvažuji, že by šla určit i pro každý výsledek zvlášť. Sám bych pro to ale asi neměl využití.
Diskuse je zrušena z důvodu spamu.