NDB různé dotazy – cache?

- sKopheK
- Člen | 207
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_phase → phase.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
verze nette?
nevim, jestli nette\database nema problem se slozenymi PK, zkus si pro phase_setting vytvorit klasicky pk s ai..