Druhý parametr ActiveRow->ref() a problém s kešováním

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Růžička
Člen | 43
+
0
-

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?

hrach
Člen | 1836
+
0
-

Použij nightly verzi, tam je to už dlouho opravené.

David Růžička
Člen | 43
+
0
-

Tak jsem zkusil nightly verzi a nakonec i verzi v2.0beta-384 z gitu a chová se to pořád stejně :(

hrach
Člen | 1836
+
0
-

Nepodarilo se mi nasimulovat. Nasimuluj to na testovaci db a posli kousek kodu, ktery ti na ni nefunguje.

David Růžička
Člen | 43
+
0
-

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');
David Růžička
Člen | 43
+
0
-

Věděl by teda někdo, kde je problém? Je to bug?