Druhý parametr ActiveRow->ref() a problém s kešováním
- David Růžička
- Člen | 43
Mám menší problém s použitím druhého parametru metody ref() třídy ActiveRow. Vše funguje správně jen při prvním načtení stránky, potom co vymažu cache. Pokud je cache už vygenerovaná, hlásí to chybu „Trying to get property of non-object“, protože $post->ref(‚user‘, ‚user_id‘) vrací NULL. Používám právě aktuální verzi Nette 2.0 Beta 2 z 12. 12. 2011.
foreach ($this->database->table('post') as $post)
{
//funguje vždy
dump($post->user->name);
//funguje jen s promazanou keší
dump($post->ref('user', 'user_id')->name);
}
Víte někdo kde může být problém?
- David Růžička
- Člen | 43
Tak jsem zkusil nightly verzi a nakonec i verzi v2.0beta-384 z gitu a chová se to pořád stejně :(
- David Růžička
- Člen | 43
Tak jsem to zkoumal a na testovací db se mi to taky neprojevilo. Nakonec jsem přišel na to, že nefunkčnost způsobují další dotazy na tabulku, které se v aplikaci ještě volají. Vytvořil jsem jednoduchý příklad, na kterém by to chování mělo jít nasimulovat.
Jak jsem psal, při prvním načtení (když je promazaná cache), vše funguje a vypíše se seznam jmen. Další načtení způsobí chybu. Vypadá to, že druhý dotaz na tabulku ‚post‘ přepíše cache a ztratí se tak info o odkazovaných sloupcích z tabulky ‚user‘. Dá se s tím něco dělat?
foreach ($this->database->table('post') as $post)
{
dump($post->ref('user', 'author_id')->name);
}
//Pokud se zaremuje, předchozí cyklus funguje i při opakovaném načtení stránky.
$count = $this->database->table('post')->count();
SQL tabulek
CREATE TABLE `post` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`author_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
INSERT INTO `post` (`id`, `author_id`) VALUES
(1, 1),
(3, 2);
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
INSERT INTO `user` (`id`, `name`) VALUES
(1, 'Pepa'),
(2, 'Honza');