Hromadný update s limitem

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

Zdravím,

v Nette teprve začínám, takže to možná bude blbá otázka, ale narazil jsem na takový zvláštní zádrhel, který mi není uplně jasný.

Potřebuju udělat update s limitem, ktery jsem zapsal přibližně takto:

return $this->database->table($table)->where($where)->limit(10)->update($data);

Tento řádek mi, ale hodil tuto vyjímku:
Nette\NotSupportedException : LIMIT clause is not supported in UPDATE query.

Následně jsem dotaz přepsal bez použití builderu asi takto:

return $this->database->query('UPDATE '.$table.' SET blokace = ? WHERE blokace = 0 AND status = 1 LIMIT ? ', $user, $limit);

Tento dotaz se sice provede správně, ale zase nevrací počet ovlivněných řádku, takže jsem ještě hledal kde k tomu přijdu a to se mi nakonec povedlo takto:

$result = $this->database->query('UPDATE '.$table.' SET blokace = ? WHERE blokace = 0 AND status = 1 LIMIT ? ', $user, $limit);
return $result->getPdoStatement()->rowCount();

Vše nyní funguje jak chci, ale přijde mi to zbytečně složitý a krkolomný. Proč Query Builder nepodporuje LIMIT u UPDATE? Nepřijde mi to jako nějaká složitá věc. A proč ten result je objekt naplněnej skoro samejma NULLama, ten počet ovlivněných řádku by měl být snáze dostupný.

Pokud jsem něco zásadního přehlídl, tak mi prosím napište, rád se zas něco přiučím :)

PetrHH
Člen | 49
+
-2
-

Dobrý den,

nemělo by to být spíše takto?

return $this->database->table($table)->where($where)->update($data)->limit(10);

Kdysi jsem na to už narazil a nějak vyřešil. Teď to bohužel nemohu nikde najít.

Petr

Tyraxor
Člen | 31
+
0
-

V tomto tvaru to použít nejde, hlásí to chybu „Call to a member function limit() on a non-object“, funkce update rovnou vykoná dotaz, takže ten limit se provádí až na výsledku, což je v tomto případě integer, proto to hlásí, že to není objekt.