activeRow->ref() háže Trying to get property of non-object

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

Modelový příklad berte s rezervou, chci jen demonstrovat můj problém:

Mám tabulku Users se sloupcem title odkazující na tabulku UserTitles. Následující kód se bezchybně provede pouze s promazaným cache, poté již háže NOTICE Trying to get property of non-object. Témat na fóru se stejným problémem je povíc, nicméně jsem řešení nenašel.

public function isFemale($id) {
    $user = $this->context->createUsers()->find($id)->fetch();
    return in_array($user->ref("title")->title, array("Mrs.", "Ms."));
}

Zajímavé je, že na produkčním režimu nic podobného nehlásí.

EDIT: používám Nette\Database

Editoval castamir (28. 6. 2012 19:11)

jtousek
Člen | 951
+
0
-
$user->ref("title")
//nebo
$user->title
//ale ne obojí!
castamir
Člen | 629
+
0
-

Trošku nešikovně jsem zvolil ten přiklad… chtěl jsem odkázat na sloupec title tabulky UserTitles, ale

$user->title // odkazuje na PK
$user->ref("title") // na cely radek
jtousek
Člen | 951
+
0
-

Jo takhle. Nechybí náhodou v produkční db příslušný záznam v té tabulce UserTitles?

castamir
Člen | 629
+
0
-

Nechybí. Když mám smazané cache, vše jede, ale při dalším načtení (už třeba po f5) to hodí daný NOTICE

Editoval castamir (28. 6. 2012 22:15)

jtousek
Člen | 951
+
0
-

Aha. Podobné věci se tu řeší každou chvíli. Zkus tuhle větev.

castamir
Člen | 629
+
0
-

Trošku zdlouhavé, ale funkční řešení:

public function isFemale($id) {
    $user = $this->context->createUsers()->find($id)->fetch();
    $row = $user->ref("title");
    return in_array($row["title"], array("Mrs.", "Ms."));
}

V cache se objekt mění na pole, což je zpětně nekompatibilní… co už…

hrach
Člen | 1838
+
0
-

Coze? Nette\Database rozhodne nepouziva cache na vysledky dotazu, tzn. objekt ActiveRow by se fakt cachovat nemel ;) Nebo sis to cachoval nekde ty?

castamir
Člen | 629
+
0
-

Já rozhodně nic explicitně necachuju. Dělá mi to všude, kde mám metodu ref() a laděnka podle toho ukazuje buď na továrnu, presenter anebo šablonu, která by se měla cachovat automaticky.