nette\database chyba se zaplou cache

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

Ahoj,

mám tu klasickou vazbu M:N

deepsky (id, name …)
deepsky_image (deepsky_id, image_id)
image (id, name …)

<?php
		foreach ($this->model->database->table('deepsky')->get(10342)->related('deepsky_image')->limit($paginator->itemsPerPage, $paginator->offset) as $rel){
			$images[] = $rel->image;
		}
?>

Problém je že při zaplé cache, kód proběhne jen na první pokus při dalším pokusu skončí na $images[] = $rel->image; viz http://eburda.eu/exception.html

Problém s cache je to určitě protože při smazání $service->setCacheStorage($this->cacheStorage); z configuratoru to funguje ok.

Nette dnes stažené z gitu.

hrach
Člen | 1834
+
0
-

Diky moc za report. Melo by to byt opravene. Zkus prosim ;)

hrach
Člen | 1834
+
0
-

jo a vidis, mas to trochu divne napsany, slo by to napsat takto (o dotaz min):

foreach ($this->model->database->table('deepsky_image')->where('deepsky_id', 10342)->limit($paginator->itemsPerPage, $paginator->offset) as $rel){
	$images[] = $rel->image;
}
Ani
Člen | 226
+
0
-

V nejnovějším to také nefunguje, totožná chyba.

Co jsem koukal na ty commity, tak mi přijde že jsi to opravil, ale ty dva další commity to zase rozbily. Bohužel teď nevím jak si stáhnout konkrétní revizi z gitu (abych vyzkoušel jestli to tak bylo opravdu), případně to večer vyzkouším.

hrach
Člen | 1834
+
0
-

Zkus mi prosim poslat ukazku, ktera nefunguje na testovaci db. Ja jsem to stejne na ni zkousel a fungovalo mi to…

Ani
Člen | 226
+
0
-

Tak jsem přišel na to čím to je. Na té vazební tabulce musí být PRIMARY přes oba sloupce. Což je částečně omezujicí (asi ne v moc případech), protože PRIMARY je UNIQUE.

Díky za podporu.

hrach
Člen | 1834
+
0
-

Ha, to vyzkousim a zkusim navrhnout opravu, aby to vyhazovalo nejakou smysluplnou chybu. Kazdoapdne na vazebni tabulkce primarni klic byt nemusi. Respektive pokud nema ani jeden sloupec primarni klic, vraci databaze oznaceni jako primarni na vsechny sloupce – a tak to funguje myslim dobre.

Ani
Člen | 226
+
0
-

Trochu jsem to ještě zkoušel a chová se to zvláštně.

Následujicí kód:

<?php
		$tags = array();
		foreach ($this->context->database->table('book_tag')->where('book_id', 1)->limit(5, 0) as $rel){
		    $tags[] = $rel->tag;
		}
?>

Když mám ve vazební INDEX (book_id) a INDEX (tag_id) žádný primary, tak každý refresh stránky položí jiné dotazy :) Jednou skončí erorrem, podruhé ne.

Když mám PRIMARY (book_id, tag_id) funguje OK

Editoval Ani (30. 1. 2012 17:54)

hrach
Člen | 1834
+
0
-

Hmhm, tak sem se mozna zmylil, kazdopadne myslim, ze primarni klic na obou sloupcich nicemu nevadi a je koncepcne spravne. Taky na to pak mrknu. Diky.