NDB různé dotazy – cache?

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

Narazil jsem na podivné chování NDB a rád bych se zeptal, čím by to mohlo být způsobené, případně jak se toho vyvarovat. Pokud tahám data z jedné tabulky, NDB si je pěkně uloží někam pro sebe, aby se nepokládalo více dotazů. Nicméně, když použiji na objektu třídy ActiveRow metodu related() a po upřesnění detailů si chci pomocí fetch() vytáhnout hodnotu náležící ke klíči výše zmíněného objektu ActiveRow, v různých případech se vrací různé hodnoty.

Schéma db:
phase (id, …) PK (id)
phase_settings (id_phase, type, value) PK (id_phase, type) FK (id_phasephase.id)

// $row je ActiveRow z tabulky `phase`
$setting = $row->related('phase_settings')->where('type', 'advancing')->fetch();
$val = $setting ? $setting->value : NULL;

Po zobrazení akce je vše v pořádku, položí se 19 dotazů do db a z tabulky se vytáhnou správné hodnoty (odpovídající správnému primárnímu klíči). Pokud se ale na akci přesměruje po upravení nějakého řádku tabulky, ze které se tahá, položí se dotazů 21 a hodnota je chybná.

V tabulce s PK (id_phase, type) jsou hodnoty (id_phase, value): (11, 5), (14, 9), (16, 9). Chci data z id_phase 14. Dotaz při zobrazení bez přesměrování z editace:

SELECT `id_phase`, `type`, `value`
FROM `phase_settings`
WHERE (`phase_settings`.`id_phase` IN (11, 14, 16)) AND (`type` = 'advancing')

Vrátí se 9, což je v pořádku.

Výše uvedený dotaz při zobrazení po přesměrování z editace je nahrazen následujícími dvěma, přičemž první se vždy pokaždé provede na prvním řádku kódu výše a druhý se pokládá vždy až při žádosti o sloupec value z db o řádek níže.

SELECT `id_phase`, `type`
FROM `phase_settings`
WHERE (`phase_settings`.`id_phase` IN (11, 14, 16)) AND (`type` = 'advancing')

SELECT *
FROM `phase_settings`
WHERE (`phase_settings`.`id_phase` IN (11, 14, 16)) AND (`type` = 'advancing')

a vrátí se 5… Podobně se duplikují i další dotazy na stejnou tabulku.

Při podrobnějším zkoumání jsem zjistil, že špatná hodnota se vrací pouze tehdy, když mezitím něco dělám s jinými řádky z tabulky phase, které mají taky svázané hodnoty z phase_settings – když si hodnotu vytáhnu ještě než něco dělám s ostatními, je to v pořádku.

David Matějka
Moderator | 6445
+
0
-

verze nette?

nevim, jestli nette\database nema problem se slozenymi PK, zkus si pro phase_setting vytvorit klasicky pk s ai..

sKopheK
Člen | 207
+
0
-

Píšu to vždycky hned na začátku příspěvku, ale teď jsem zapomněl :)
Nette 2.1dev

Zkusím, díky.

EDIT: Přidání sloupce id, který byl určen jako PK namísto dvojice id_phase, type bohužel nepomohlo.

Editoval sKopheK (28. 12. 2013 17:58)