extends DibiRow – ukládání $this při vytváření nových vlastností objektu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
drakul
Člen | 37
+
0
-

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
+
0
-

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

drakul
Člen | 37
+
0
-

Aha :-) Nu já jsem začal používat dibi podle tutoriálů pro nette :-) Trošku mi chybí v současné verzi nette (2.0) více příkladů s napojením na datovou vrstvu. Kdybyste někdo měl nějaký dobrý „nette-databázový“ návod, kterým je dobré se řídit, rád se poučím.
Děkuji za rady

22
Člen | 1478
+
0
-

myslím, že toto by tě mohlo zajímat

drakul
Člen | 37
+
0
-

22 napsal(a):

myslím, že toto by tě mohlo zajímat

Díky moc za inspiraci. Jen jeden dotaz. Vyhýbal jsem se NotORM kvůli tomu, že neřeší vkládání a upravování dat v db, jen čistý SELECT. Není lepší, když se o SELECT a CRUD stará stejný manager?
Díky

Tharos
Člen | 1030
+
0
-

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
+
0
-

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
+
0
-

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.