Pokus o dibi ORM

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

phx napsal(a):

Koukam na to a libi se mi to. Ale po prvni euforii me zase napada, ze ciste SQL (nebo DibiFluent) je lepsi na vytahovani dat z DB. Nemuzu si pomoc, ale prijde mi, ze vsechny ORM pohlizeji na data pouze uzce v ramci jedne Entity s nejakyma vazbama na okolni Entity. Bohuzel vetsinou v App kdyz uz neco vypisuji, napr seznam uzivatelu, tak me nezajima jenom jmeno a prijmeni, ale i dalsi veci. Napr pocet clanku, datum posledni aktivity atd. Proste data co se ziskaji z ostatnich tabulek. To je jeste OK, ale pak prijde pozadavek na moznost razeni dle techto informaci. A ORM je v konci. Protoze v tu chvili but ORM nacte vsechno z DB a seradi to v PHP ruco fuco (vykonost musi byt uzasna = hruza des:) a nebo to posle do DB jeden slozity dotaz. V tu chvili mi prijde ORM zbytecne. Alespon co se tyce dolovani dat z DB.

Opravte me pokud mam na to pokriveny pohled. Uz 2 dny premylsim kudy vede cesta a zatim mi nejlepe vychazi kombinace chytry objekt na insert/update/delete + DibiFluent na dolovani dat z DB.

Po dlouhých úvahách jsem došel k tomu samému. Používám chytrý objekt (no občas by mohl být chytřejší :) a DibiFluent. Musím říct, že psaní SQL mě rozhodně nezdržuje. Standardní SQL umí automaticky chytrý objekt, složitější chci mít pod kontrolou (zároveň si testuju indexy atd). Pro mě výhodu ORM vidím v tom, že se mi někde do objektu uloží struktura databáze a já pak můžu jednoduše vygenerovat formulář.

Honza Kuchař
Člen | 1662
+
0
-

Honza Marek napsal(a):

Jinak v modelu ti asi nic nebrání mít speciální fluenty, které mohou vracet data v těch entitních obálkách ($dibiResult->setRowClass($entityClassName))

Přesně tak to řeším. :-)

phx
Člen | 651
+
0
-

Pak je otazka zda to vracet v jedne Entite s x polozkama (read-only) co s Entitou nemaji moc spolecneho nebo to rozkouskovat do vice Entit a vratit to jako „strom“ Entit.

Osobne zatim pouzivam neco jako 1. zpusob, ale prevazne to je kuli DataGridu a jednoduche praci s Forms.

Pak je otazka zda vubec nejake slozite ORM pouzivat, kdyz vetsinu data stejne taham pomoci SQL a pri praci s formulari (nacti, zmen, uloz) mi staci relativne jednoduchy objekt. Na to proste slozite ORM nepotrebuji.

Nadruhou stranu se mi libi myslenka mit uzavreny Model, ktery by resil veskerou bussiness logiku. Ale furt se mi nedari spojit Model a optimalni vykonost dohormady. But to bude univerzalni model s hroznyma dotazama nebo to je hezky univerzalni model se specialni funkci pro kazdy vypis z DB. To pak je akorat opruz to psat.

srigi
Nette Blogger | 558
+
0
-

phx napsal(a):

Uz 2 dny premylsim kudy vede cesta a zatim mi nejlepe vychazi kombinace chytry objekt na insert/update/delete + DibiFluent na dolovani dat z DB.

Ale furt se mi nedari spojit Model a optimalni vykonost dohormady.

Už by sa konečne malo za to sadnúť a poriadne ten Model vs. DB engine prediskutovat. Je predo mnou startup a ja vážne neviem ktorému riešeniu zverim persistovanie údajov. Presne pre citovane dôvody.

phx
Člen | 651
+
0
-

Dneska jsem to zkousel kapku napsat a kdyz jsem zjistil, ze vlastne tvorim skoro to same co Ormion tak jsem to vzdal. Chtel jsem se totiz drzet nech 5ti vrstev (http://www.phpguru.cz/…rstev-modelu).

Proto jsem si rek, ze udelam neco pro komunitu a prevadim Ormion pro PHP 5.2.?. Bohuzel zatim stale jsem na 5.2:(

Vse funguje zda se OK, jen v modelu musi byt par metod kuli static vs self a samozrejmne nebude fungovat __callStatic(). Hold se to bude muset do toho modelu napsat a volat __callStatic rucne:)

No ale mam problem. Mapper.php radek 111±

	protected function loadAssociations() {
		$annotations = ClassReflection::from($this->rowClass)->getAnnotations();

		foreach ($annotations as $k => $v) {
			if ($v[0] instanceof Ormion_IAssociation) {
				foreach ($v as $association) {
					$this->addAssociation($association->getName(), $association);
				}
			}
		}
	}

kde se v annotacich vezme trida IAssociation (Ormion_IAssociation je kuli absenci namespace v PHP 5.2). Ja kdyz zkousim ukazkovou app tak tam mam ArrayObject. Muzete mi to nekdo Debug::dumpnout v PHP 5.3. Nebo jsem nekde opomenul nastavit nejaky callback pro annotace v Nette?

array(5) {
   "author" => array(2) {
      0 => string(9) "Jan Marek"
   }
   "license" => array(1) {
      0 => string(3) "MIT"
   }
   "table" => array(1) {
      0 => string(5) "pages"
   }
   "manyToMany" => array(1) {
      0 => object(ArrayObject) (5) {
         "name" => string(4) "Tags"
         "referencedEntity" => string(3) "Tag"
         "connectingTable" => string(11) "connections"
         "localKey" => string(6) "pageId"
         "referencedKey" => string(5) "tagId"
      }
   }
   "hasMany" => array(1) {
      0 => object(ArrayObject) (3) {
         "name" => string(8) "Comments"
         "referencedEntity" => string(7) "Comment"
         "column" => string(4) "page"
      }
   }
}
phx
Člen | 651
+
0
-

Ha uz jsem to nasel. Ono Nette samo najde tridu co se jmenuje $name . 'Annotation'. Takze to je moje blbost. Muze za to to prejmenovani objektu na Ormion_*

Honza Marek
Člen | 1664
+
0
-

Jj, dokonce jsem pro ty třídy pod PHP 5.3 ani nemohl použít namespace, funguje opravdu jen $name . 'Annotation'.

phx
Člen | 651
+
0
-

Tak jsem to rozsek. Ormion pro PHP 5.2.?. Je to slusny ORM a DibiFluent je tu zaobalen do Collection, takze to do toho jde celkem pekne napasovat. Jsem zvedav jak se to osvedci.

Dostupne zde: https://github.com/…velka/Ormion

Editoval phx (5. 6. 2010 0:32)