Zvladne nette database tento dotaz (ne přímý zápis sql)?
- sitnarf
- Člen | 27
Zdravím,
pokouším se ve svém projektu o Entity–attribute–value model, pro jeho
používání je nutné dělat dotazy jako tento (tento konkrétně je někde
z netu). Tento dotaz vrátí položky, které „právě probíhají“ a pole
„artist“ má dané jméno. Zvládne Nette Database tento dotaz bez
přímého zápisu SQL?
Ptám se proto, protože celá aplikace už je postavená na objektech
Selection, ActiveRow atd. a tato část je musí používat taky, jinak musím
předělat celou aplikaci asi na Dibi Fluent.
tabulka field_values:
entity field value
1 start_date June 1, 2010
1 end_date August 30, 2010
1 name some name
SELECT start.entity
FROM entity
JOIN field_values AS start
ON entity.id = start.entity AND start.field = 'start_date'
INNER JOIN field_values AS end
ON entity.id = end.entity AND end.field = 'end_date'
INNER JOIN field_values AS artist
ON entity.id = artist.entity AND artist.field = 'artist'
WHERE STR_TO_DATE(start.value, '%M %d, %Y') < NOW()
AND STR_TO_DATE(end.value, '%M %d, %Y') > NOW()
AND artist.value="some artist"
Editoval sitnarf (13. 7. 2013 18:33)
- enumag
- Člen | 2118
Nezvládne, protože NDB neumí dávat tabulkám aliasy. Sice jsem na to už několikrát upozorňoval, ale bez odezvy. :-) View ti to vyřeší ale budeš pak mít pro změnu problém s reflexí.
Mimochodem tvůj návrh struktury databáze se mi ani trochu nelíbí, vůbec neodpovídá mé představě o relačních databázích. V podstatě by ta tabulka imho měla mít prohozené řádky a sloupce.
Editoval enumag (15. 7. 2013 8:22)
- sitnarf
- Člen | 27
enumag napsal(a):
Nezvládne, protože NDB neumí dávat tabulkám aliasy. Sice jsem na to už několikrát upozorňoval, ale bez odezvy. :-) View ti to vyřeší ale budeš pak mít pro změnu problém s reflexí.
Mimochodem tvůj návrh struktury databáze se mi ani trochu nelíbí, vůbec neodpovídá mé představě o relačních databázích. V podstatě by ta tabulka imho měla mít prohozené řádky a sloupce.
Jak by mi pomohly view? Tak já prostě všechno přepíšu do DibiFluent, měl jsem na Nette Database založený model, teď jsem na Nette Database už ale úplně zanevřel.
off topic
Jmenuje se to entity-attribute-value model, je to problematická věc.
Používám to ale protože potřebuju v administraci libovolně menit počet
polí u stránky a potom podle nich řadit (řešil jsem to tady http://devel.cz/…-cms-v-mysql).
Ve skutečnosti to mám řešení ještě složitěji, mám to rozdělené ještě do dalších tabulek, které popisují vlastně schéma, takže těch joinů je dvakrát víc : )). Není to ideální, ale potom to budu cachovat, tak s tím snad nebude problém.
Editoval sitnarf (15. 7. 2013 9:28)
- Lister
- Člen | 12
sitnarf napsal(a):
Zdravím,
pokouším se ve svém projektu o Entity–attribute–value model, pro jeho používání je nutné dělat dotazy jako tento (tento konkrétně je někde z netu). Tento dotaz vrátí položky, které „právě probíhají“ a pole „artist“ má dané jméno. Zvládne Nette Database tento dotaz bez přímého zápisu SQL?
Ptám se proto, protože celá aplikace už je postavená na objektech Selection, ActiveRow atd. a tato část je musí používat taky, jinak musím předělat celou aplikaci asi na Dibi Fluent.tabulka field_values: entity field value 1 start_date June 1, 2010 1 end_date August 30, 2010 1 name some name
SELECT start.entity FROM entity JOIN field_values AS start ON entity.id = start.entity AND start.field = 'start_date' INNER JOIN field_values AS end ON entity.id = end.entity AND end.field = 'end_date' INNER JOIN field_values AS artist ON entity.id = artist.entity AND artist.field = 'artist' WHERE STR_TO_DATE(start.value, '%M %d, %Y') < NOW() AND STR_TO_DATE(end.value, '%M %d, %Y') > NOW() AND artist.value="some artist"
Toto jde pomerne jednodusse s notorm… pokud teda netihnes k aliasum, ale i ty tam jdou udelat, akorat prijdes o dynamiku statickym selectem
Musis zabrednout do notorm, jdou s tim delat jeste mnohem vetsi silenosti… Nechce se mi premyslet nad abstraktnima entitama, cili kdyz uvedes prakticky priklad, sesmolim ti to tu.
- sitnarf
- Člen | 27
Lister napsal(a):
sitnarf napsal(a):
Zdravím,
pokouším se ve svém projektu o Entity–attribute–value model, pro jeho používání je nutné dělat dotazy jako tento (tento konkrétně je někde z netu). Tento dotaz vrátí položky, které „právě probíhají“ a pole „artist“ má dané jméno. Zvládne Nette Database tento dotaz bez přímého zápisu SQL?
Ptám se proto, protože celá aplikace už je postavená na objektech Selection, ActiveRow atd. a tato část je musí používat taky, jinak musím předělat celou aplikaci asi na Dibi Fluent.tabulka field_values: entity field value 1 start_date June 1, 2010 1 end_date August 30, 2010 1 name some name
SELECT start.entity FROM entity JOIN field_values AS start ON entity.id = start.entity AND start.field = 'start_date' INNER JOIN field_values AS end ON entity.id = end.entity AND end.field = 'end_date' INNER JOIN field_values AS artist ON entity.id = artist.entity AND artist.field = 'artist' WHERE STR_TO_DATE(start.value, '%M %d, %Y') < NOW() AND STR_TO_DATE(end.value, '%M %d, %Y') > NOW() AND artist.value="some artist"
Toto jde pomerne jednodusse s notorm… pokud teda netihnes k aliasum, ale i ty tam jdou udelat, akorat prijdes o dynamiku statickym selectem
Musis zabrednout do notorm, jdou s tim delat jeste mnohem vetsi silenosti… Nechce se mi premyslet nad abstraktnima entitama, cili kdyz uvedes prakticky priklad, sesmolim ti to tu.
Díky : ) Jak jsem psal, schéma je ještě trochu složitější: http://sqlfiddle.com/#!8/232be/17.
Není to jen field_name => field_value
, ale existuje jeste dalsi
tabulka, ktera obsahuje informace o polích, takž je to spíš
field_type_id => field_value
.
Editoval sitnarf (16. 7. 2013 12:28)