Zvladne nette database tento dotaz (ne přímý zápis sql)?

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

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)

sitnarf
Člen | 27
+
0
-

Nikdo? :) V podstatě jde o tohle, můžu udělat bez přímého zápisu INNER JOIN field_values AS end, já myslím právě, že ne.

h4kuna
Backer | 740
+
0
-

Pomohlo by kdyby jsi si udělal view a nad tím view spouštěl jednodušší sql, které už půjde napsat ND?

enumag
Člen | 2118
+
0
-

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

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)

hrach
Člen | 1836
+
0
-

Jednoduse se da nahackovat reflexe, že třeba všechno za _as_ se stripne pro hledani joinu. Neni to sice pekne reseni, ale mozne.

Lister
Člen | 12
+
0
-

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

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)

sitnarf
Člen | 27
+
0
-

hrach napsal(a):

Jednoduse se da nahackovat reflexe, že třeba všechno za _as_ se stripne pro hledani joinu. Neni to sice pekne reseni, ale mozne.

Můžeš to prosím trochu rozvést?