lastInsertId() je 0 při použití DevNullStorage

kminekmatej
Generous Backer | 38
+
0
-

Narazil jsem asi na bug v Nette? Doufám že ne a jsem jen blbej :).

V Nette Testeru mám vyplé cachování:

services:
  cacheStorage:
    class: Nette\Caching\Storages\DevNullStorage

Následně přidám záznam do databáze:

$row = $this->database->table('todo')->insert($create);
var_dump($row);

Dumpne mi to FALSE.

Zjistil jsem že když mám DevNullStorage tak po vložení záznamu do databáze, Nette DBEx volá SHOW FULL TABLES ve funkcích Nette\Database\Structure::needStructure()Nette\Database\Structure::loadStructure()Nette\Database\Drivers::getTables()
Po provedení tohoto příkazu pak přímo PDO na lastInsertId() vrací 0

Sranda je že ten záznam se ve skutečnosti vytvoří. Pouze lastInsertId() selže a proto metoda insert() vrátí FALSE

Editoval kminekmatej (22. 5. 2019 16:04)

kminekmatej
Generous Backer | 38
+
+1
-

Když mi nikdo neodpověděl, tak si odpovím sám, třeba to někomu v budoucnu pomůže. Jednalo se o bug v Nette/Database, projevující se při nevybudování cache:
https://github.com/…ase/pull/217

Opravený v Nette v3. Krom ruční opravy není příliš možnost jak to fixnout – pouze přepsat to přímo ve zdrojáku ve složce vendor (a nedělat composer update/install).

Správné řešení je přejít na Nette 3. Good luck ;)