Bug u related (nejspíš v cachování?)

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

U následujícího kódu mi to vrací stejné výsledky, i když by nemělo. Donedávna to fungovalo správně, ale nějakým nedávným updatem se to pomršilo (používám aktualní dev verzi nette)..

foreach ($this->table('servers') as $server) { /* @var $server ActiveRow */
	$total = $server->related('offer', 'id_server') //celkovy pocet
		->count('id_offer');
	$active = $server->related('offer', 'id_server') //pouze aktualnich
		->where('active', 1)
		->where('NOW() <= end_time')
		->where('start_time IS NULL OR start_time < NOW()')
		->count('id_offer');

	... pouziti onech hodnot ...
}

Momentálně to vrací stejný počty pro oboje (total i active) pro všechny krom prvního průchodu cyklem. Oba dva dotazy se sice spouštěj, ale výsledky to bere jen z toho active. Když jeden z nich zakomentuju, výsledky pro danej dotaz se zobrazujou správně.

Editoval Caine (2. 4. 2012 16:55)

Caine
Člen | 216
+
0
-

Po trošce zkoumání tenhle bug zavadí commit https://github.com/…8638e45ff8da

hrach
Člen | 1834
+
0
-

Díky, už mám připravený fix.

Caine
Člen | 216
+
0
-

Našel jsem další bug. Podmínka na https://api.nette.org/…ion.php.html#747 se vymaže v tý funkci setActive (#750), takže dotaz se spustí bez ní (dotaz vrátí všechny záznamy) a ačkoliv je výsledek ve finále správný (očekávaný výsledek), rozhodně není optimální (v mém případě se zbytečně vrátí něco přes 10 tisíc záznamů).

hrach
Člen | 1834
+
0
-

Set active se vola jen při jiném průchodu cyklu a vhledem k tomu, že to volání máš v cyklu, měli by se podmínky opět definovat.

Peetee
Člen | 75
+
0
-

hrach napsal(a):

Set active se vola jen při jiném průchodu cyklu a vhledem k tomu, že to volání máš v cyklu, měli by se podmínky opět definovat.

Myslím, že s kolegou řešíme stejný problém – viz https://forum.nette.org/…-verzi-2-0-2#… teď nevím, jestli z Tvé odpovědi pro nás něco vyplývá.

Caine
Člen | 216
+
0
-

Nejedná se o kód z úvodu (se smyčkou), ale o přibližně takový

$this->user->getActiveRow()->related('sometable')->select($primaryCol)->fetchPairs($primaryCol, $primaryCol);

Do db se pošle jen obyčejnej SELECT nejaky, sloupce FROM sometable bez WHERE, takže db vrátí zbytečně všechny záznamy z tabulky.

Pilda
Člen | 52
+
0
-

To bude možná ten samý bug jako tento.

hrach
Člen | 1834
+
0
-

@Pilda: Díky. Ja uz se na to asi vykaslu. Sotva clovek fixne jeden bug, uz musi fixovat dalsi, protoze vsechno to drzi pohromade jen silou vule.