Nette\Database: ->insert($data) vrací FALSE (Nette 2.3)

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

Ahoj,

po updatu na Nette 2.3 se mi v logu začaly objevovat zvláštní chyby. Obvykle se točí okolo toho, že vložím řádek a následně s výsledkem hned pracuji, například:

$row = $this->database->table('table')->insert([ /* ... */ ]);

$id = $row->id; // vyhotí notice
$object = new MyObj($row); // vyhodí Recoverable Error, protože v constructoru vyžaduje ActiveRow

Problém je v tom, že se mi problém nedaří nasimulovat, pokud stejné akce provedu já, vše proběhne v pořádku. Problém zřejmě nenastane pokaždé. I když nastane zmíněná chyba, tak se do databáze řádek uloží.

Řešením by samozřejmě byla podmínka if (!$row), která by problém odhalila a bylo by možné řádek z db vytáhnout, ale proč nefunguje zmíněná konstrukce? mám se jí raději vyhnout? nastala zde nějaká změna, nebo byla náhoda, že ve v Nette 2.2 to fungovalo (případně nefungovalo a v logu jsem to přehlédl).

pata.kusik111
Člen | 78
+
0
-

Řeším stejný problém při práci s hotovou komponentou stáhnutou composerem. Má naprosto stejnou konstrukci.
Zabije se na řádku

$id = $row->id;

S notice „Trying to get property of non-object“
Dle laděnky hodnota $row je 1 a ne FALSE jako v tvém případě.
Jedná se o Nette 2,3,1. Podle dokumentace by se to mělo stát pouze v případě, že tabulka nemá pimary key.
Nicméně tabulka primary key má.

UPDATE: Vyřešeno vymazáním cache databázové struktury. Zdá se, že si nette špatně zapamatovalo, že tabulka nemá primary key.

Editoval pata.kusik111 (29. 4. 2015 15:49)