NDB related a nefunkční limit

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

Nette 2.1dev

Schéma: http://img.lipe.cz/phase_table.jpg
Mám vytažený objekt ActiveRow z tabulky phase_group a chci pro něj všechny sdružené záznamy z phase_group_round:

$this->related('phase_group_round')->order('id ASC')->fetchAll();

NDB pokládá dotaz např.

SELECT `id`, `id_phase_group`
FROM `phase_group_round`
WHERE (`phase_group_round`.`id_phase_group` IN (78, 79, 80, 81))
ORDER BY `phase_group_round`.`id_phase_group`, `id` ASC

kde 78,79,80,81 jsou id z tabulky phase_group, které patří k jednomu řádku z phase.

Je to tím, že jsou ty vztahy neurčující a primární klíč je jen to id?

Při procházení výsledků se vrací jen ty patřící dané phase_group, což je v pořádku – proč se ale musely vracet i ty, co nepoužiji? Zatím to řeším to přidáním podmínky ->where('id_phase_group', $this->id), která omezí počet vrácených výsledků jen na ty adekvátní, ale v SQL stále zůstává ta první podmínka s IN.

Problém nastane, když chci vybrat jen jeden řádek z phase_group_round podle pořadí přes LIMIT:

$this->related('phase_group_round')->order('id ASC')->limit(1, (int)$order)->fetch();

SQL je stejné jako výše (LIMIT chybí) a vrátí se pokaždé jen první prvek. Ve zdrojových kódech třídy GroupedSelection jsem našel, že se klauzule LIMIT za určitých podmínek jednoduše smaže…
Musím si nechat vrátit všechny řádky a přes array_slice() vybrat ten na požadovaném místě.

hrach
Člen | 1844
+
0
-

Hele, moc se v tom nevyznam, protoze je to zpraseny :D

  • to schema nevypada nijak moc klasicky spravne
  • to, ze volas $this-> znaci, ze je neco uplne spatne
  • neni videt zbytek kodu
  • obecne pro reference sama na sebe je treba ohybat reflection.
sKopheK
Člen | 207
+
0
-
  • je to dano potrebou systemu – kazda faze ma ruzny pocet skupin, ty maji ruzny pocet kol…
  • $this-> volam ve tride, ktera je potomkem ActiveRow
  • je zbytek kodu potreba, kdyz se ptam na veci spjate s uvedenymi prikazy?
  • nechapu
hrach
Člen | 1844
+
0
-

Uz to asi chapu, princip je v tom, ze ty nechapes Nette\Database. Selectuji se vsechny radky i pro ostatni z kolekce, na ktere volas related. To, ze $this je instance activeRow si mam vycarovat jak?

sKopheK
Člen | 207
+
0
-

Dobře, pomiňme teda principy, které nechápu a zaměřme se na jádro pudla: proč nefunguje ten limit. Když se to dá nastavit a nic to neudělá, tak je něco špatně.