extends DibiRow – ukládání $this při vytváření nových vlastností objektu
- drakul
- Člen | 37
Zdravím, předem se omlouvám za krkolomné pojmenování předmětu, ale bohužel jednou větou lze těžce vysvětlit můj „problém“. V několika tutoriálech jsem se naučil ukládat data z modelu do db pomocí
Class TableRow extends DibiRow
public function save(){
return dibi::query('UPDATE [table] SET',(array) $this,'WHERE column_id=%i',$id);
}
problém nastává když si do třídy TableRow chci přidat nové
vlastnosti, které nemají svoji reflexi ve struktuře tabulky v db. Doteď
jsem to řešil tak, že jsem ve funkci save() před provedením dibi::query
volal unset($this->novaVlastnost1, $this->novaVlastnost2). Nenapadá
někoho ladnější řešení ?
Díky moc za rady
- Filip Procházka
- Moderator | 4668
Ale to se přece takhle nedělá.. Navíc to ani nesouvisí s Nette.. Pokud chceš ActiveRecord nad dibi, pak se koukni, jestli by ti víc nevyhovoval Ormion od Honzy
- Tharos
- Člen | 1030
drakul: To už NotORM dávno umí (v dokumentaci koukni na záložku persistence).
Editoval Tharos (20. 6. 2011 11:06)
- drakul
- Člen | 37
Tharos napsal(a):
drakul: To už NotORM dávno umí (v dokumentaci koukni na záložku persistence).
Díky moc, hledal jsem to jen v záložce API … marně :-)
Nicméně rád bych se vrátil ještě k původnímu tématu v tomto
vláknu.
Jak řešíte načtení dat do objektu a jeho uložení do
db?
Příklad:
- Tabulka User (user_id, user_name, user_group_id,…)
- Tabulka Group (group_id, group_name, …)
- Objekt User (user_id, user_name, user_group_id, user_group = new Group($group_id))
Jelikož většinou uživatel (user) nemění svou skupinu (group) každý
den, ale informace o sobě mění častěji, vyhovovala mi možnost konvertovat
objekt user na pole (+ smazat vlastnost $this->user_group) a volat update
s těmito parametry (update(‚user‘,(array)$this);
Když si vezmu pracnost nastavení getterů a setterů pro např.: 30 sloupců
každé tabulky a jejich následné volání při vkládání / upravování
záznamu … Ale třebas jen špatně chápu danou problematiku.
Otázka tedy zní: Je správný způsob, kdy objekt s jeho vlastnostmi
přeměním na pole a poté volám update/create?
Děkuju za reakce :-)
Editoval drakul (20. 6. 2011 11:45)
- Filip Procházka
- Moderator | 4668
Je rozdíl, jestli chceš pracovat s objekty, nebo s poli.
Pokud chceš pracovat s objekty, pak máš na výběr víceméně nějaký
ActiveRecord, na což můžeš použít NotORM
, nebo
Nette\Database
. Nebo je tu ORM a ten funguje na trošku
složitějším principu.
Pokud chceš pracovat s poli, pak si můžeš udělat jednoduchou třídu, se kterou začíná spousta lidí. Říká se tomu Table Data Gateway a není to nic jiného, než že všechny SQLka související s jednou tabulkou, nacpeš do jedné třídy.