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..