[ Nikola Poša @ 07.05.2009. 19:40 ] @
Zanima me da li je bolje, da se pri projektovanju modela u Zend Framework-u, koji se bave nekim poslovima sa tabelama u bazi, upiti formiraju kao običan string ili kao instanca klase Zend_DB_Select?

Npr. ovo:
Code:

$sql = 'SELECT foo, bar FROM foobar WHERE foo = 3';

... ili ovo:
Code:

$sql = $this->db_handler->select()
                ->from('foobar', array('foo', 'bar'))
                ->where('foo = 3');

Naravno, ovaj drugi primer je u slučaju da se model ne izvodi iz Zend_Db_Table, već da ima instancu DB adaptera ($db_handler) kao člana klase...

E sad, mene zanima šta je bolje koristiti prvenstveno zbog performansi. Meni se nekako čini da je ova druga metoda samo jedan zaobilazan način da se stigne do upita, ali naravno, ima i ona svojih prednosti (sintaksno ispravni upiti, apstakcija nezavisna od tipa baze, zaštita od SQL Injection-a automatskim quote-ovanjem identifikatora i vrednosti, itd.). Ali ono što meni smeta je to što npr. nikako nije moguće formirati ovakav upit:
Code:

$sql = 'SELECT f.id, f.name, b.test, b.polje
FROM foo f, bar b
WHERE b.foo_id = f.id AND b.polje = 3';

Tačnije, nikako nije moguće da se u FROM kaluzuli koristi dve ili više tabela, već se forsiraju spajanja (join-ovi), pa bi se upit koji daje isti takav rezultat mogao dobiti jedino ovako:
Code:

$sql = $this->db_handler->select()
                ->from(
                    array('f'=>'foo '), 
                    array(
                        'f.id', 
                        'f.name', 
                        'b.test',
                        'b.id',
                        'p.polje',
                    )
                )
                ->joinInner(array('b'=>'bar'), 'b.foo_id = f.id', null)
                ->where('b.polje  = 3');

Neka me neko ispravi ako grešim...

Da vas čujem...

[ kazil @ 07.05.2009. 20:14 ] @
Zend_Db_Table je za rad nad samo jednom tabelom, ako zelis u jednom upitu vise tabela, onda trebas ici jedan "nivo" vise, tj. da radis preko $this->db_handler. Tu ti je i odgovor: ako je upit samo za jednu tabelu, koristi Zend_Db_Table, ako ti treba JOIN, radi sa db adapterom.

:)
[ Mister_rap @ 07.05.2009. 20:15 ] @
Licno uglavnom koristim Doctrine, ali ako bih morao da biram svakako bih koristio Zend_Db_Table jer mi je prosto tako jednostavnije i preglednije eventualno za neke stvari ovakav hendler...

Mozes da uzmes u razmatranje relacije konkretno za ovaj primer.
[ Nikola Poša @ 07.05.2009. 20:37 ] @
Naravno, ali moje glavno pitanje je vezano za formiranje upita: string ili Zend_DB_Select? Nisam ja postavio pitanje da li model treba da se izvodi iz Zend_Db_Table ili ne. To pitanje mi je jasno, ne znam kako je to došlo u prvi plan na osnovu mog post-a...
[ Mister_rap @ 07.05.2009. 21:30 ] @
String, premda ne mogu nista reci o eventualnoj razlici o performansama.
U mom slucaju upiti tako formirani su mi pregledniji i samim tim gotivniji.
[ Nikola Poša @ 07.05.2009. 22:13 ] @
Ok, hvala na brzim odgovorima...

Pre neki dan sam uzeo malo da prepravljam modele u jednom CMS na kome radim, pa sam slučajno na jednom forumu primetio da ljudi forsiraju te "zahvate" sa Zend_DB_Select klasom, pa rek'o da čujem mišljenje nekog iskusnijeg što se toga tiče. A kad sam uzeo malo da proučavam tu klasu i kad sam video kroz koje se sve procedure prolazi da bi se formirao upit, odma' mi je palo napamet pitanje pada performansi... Jes' da je tako dobijen upit 100% siguran i validan, ali meni je mnogo bitinija brzina, tako da ću se i ja, za sada, držati stringa...