Komentáře uživatele paranoiq
"Položka (Název) nesmí být prázdná."
s `timestamp on update current_timestamp` je ten problém, že ho lze obejít implicitním vložením údaje, který automaticky generovaný čas přebije. trigger obejít nejde. u tvého řešení je zase ten problém, že se čas updatu zapíše i když nedošlo při zápisu k modifikaci dat (když vložím stejná data jaká už v řádku jsou, trigger se i přesto provede).
já detekuji, jestli skutečně došlo ke změně dat v řádku a až poté zapisuji info o změně. to je ale dost složité na ruční psaní triggerů a tak jsem si na to napsal automat, který mi hotový trigger vygeneruje: http://gist.github.com/477277
K článku: DbDibiOrm
Re: Re: Reinventing of the Wheel
ahoj
6) lepší než __toArray nebo asArray by možna bylo implementovat IteratorAggredate: http://www.php.net/manual/en/class.iteratoraggregate.php
Re: Lazy loading
ano, víc matoucí už to být ani nemůže ^_^
jména musí být naprosto zřejmá (get == SELECT)
Re: Re: Re: Re: Lazy loading
zaprvé, ORM přeci nebude tak hloupé, aby si při načtení defaultních hodnot tyto označilo jako změněné. zadruhé, i kdybys je označil a uložil, nic tím nezměníš - jsou přeci defaultní!
myslím, že jsi nepochopil ve které situaci načíst defaultní hodnoty - ty je třeba načítat pouze při vytvoření nového záznamu Customer::create…, nikoliv při načtení existujícího Customer::get…
ještě to shrnu: při vytvoření nového záznamu třeba metodou Customer::createNew(), je třeba načíst defaultní hodnoty z databáze, tam kde jsou (a dá se to udělat i lazy).
při získání existujícího je to samozřejmě nesmysl. tady je na místě načíst celý záznam (pokud neobsahuje nějaké velké sloupce třeba typu blob atd), protože je třeba beztak udělat SELECT - i kdyby jen pro ověření, zda vůbec záznam existuje. pokud potřebuješ dělat nějaký hromadný update a nepotřebuješ u toho znát původní hodnoty , není zřejmě vůbec vhodné vytvářet modelové objekty a měla by se o to postarat nějaká statická metoda modelu, nebo nějaký helper
Re: Re: Re: Re: Lazy loading
už samotné slovíčko get na začátku názvu metody říká proč to nejde. nemůžeš přece zavolat Customer::getByCokoliv() aniž by jsi alespoň ověřil zda takový záznam vůbec existuje
Re: Re: Lazy loading
přehlédl jsem tohle: "$c = Customer::getByPrimary(1);"
to skutečně bez SELECTu nepůjde ^_^
Re: Re: Lazy loading
myslím, že 'ORM' si bude muset pamatovat, které údaje byly změněny. něco v tomto smyslu:
public function __set($name, $value) {
$this->_data[$name] = $value;
$this->_update[$name] = TRUE;
}
potom může udělat při uložení částečný UPDATE (nebo INSERT), aniž by musel načítat ostatní hodnoty z databáze
K článku: MySQL povinné hodnoty, NULL hodnoty, defaultní hodnoty, prázdné hodnoty a jak by se mělo chovat ORM
Re: Re: __NAME?__
tak to bych opravdu nečekal. díky
K článku: MySQL povinné hodnoty, NULL hodnoty, defaultní hodnoty, prázdné hodnoty a jak by se mělo chovat ORM
Re: Re: Re: Re: Položka (Název) nesmí být prázdná
to jsem sice neřekl, ale je to tak. při nevyplnění povinného údaje (který nemá defaultní hodnotu), by mělo 'ORM' vyhodit výjimku
ad a) já ho chápu tak jak jsem napsal - MANDATORY == NOT NULL. na každém povinném sloupci by někde ve vyšší úrovni měl být nějaký validátor. pokud je jedinný požadavek na hodnotu, aby tam bylo vyplněno 'něco' (=notempty), tak bude výsledek k ničemu. uživatelé tam nacpou 'cokoliv' aby to prošlo
ad b) ano. nesmyslná. má-li něco výchozí hodnotu, tak ji to má proto, aby se použila při nevyplnění
K článku: MySQL povinné hodnoty, NULL hodnoty, defaultní hodnoty, prázdné hodnoty a jak by se mělo chovat ORM
__NAME?__
nj. ale jaké jsou alternativy? :]
spouštět navíc COUNT(*) kvůli zjištění počtu řádků také není úplně levná záležitost
pekelně rychlé je to pouze na MyISAM, bez JOINů a bez WHERE
http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_count
K článku: MySQL povinné hodnoty, NULL hodnoty, defaultní hodnoty, prázdné hodnoty a jak by se mělo chovat ORM
Položka (Název) nesmí být prázdná
o právě těchhle otázkách už jsem dost přemýšlel. tady je pár mých závěrů:
1) notempty vlastnost samotná stejně nezaručuje nic. dá se jednoduše oklamat vložením nesmyslného údaje. validace, má-li mít nějaký smysl tedy beztak musí být složitější než pouhé zakázání prázdné hodnoty. ORM za nikoho problémy validity nevyřeší a to ani s pomocí notempty vlastnosti
možnosti je tedy možné redukovat na pouhé dvě - NULL a NOT NULL. přičemž každá hodnota musí projít validací na úrovni modelu, nikoliv na úrovni persistence. zda prázdný řetězec je či není validní není úkol pro persistentní vrstvu, ale pro model
2) řekněme, že se objekt ukládá metodou save(). ta slouží pouze pro persistenci a NESMÍ OVLIVŇOVAT FUNKČNOST objektu. objekt tedy musí znát defaultní hodnoty v úložišti už při svém vzniku. nelze je načíst později, ať už při uložení nebo při novém načtení v jiné session. musí je znát a vracet ihned. funkce __toArray() tedy musí vracet i defaultní hodnoty pro ty sloupce, které nebyly dosud v modelu nastaveny
jednoduchým řešením je nepoužívat defaultní hodnoty na straně úložiště, ale zavádět je v modelu (třeba v konstruktoru). to navíc podporuje i polymorfismus, kdy se jednotlivé třídy v db tabulce liší pouze jednou 'defaultní' hodnotou, která se nikdy za života objektu nemění (v podstatě slouží jen jako informace pro továrnu)
položek 0-12 z 12 [1 / 1]

RSS