NDB: Jak přepínat hodnotu BOOLEAN sloupce?
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Tori
- Člen | 32
Pěkné poledne.
Nevíte někdo, jak se dá v NDB napsat přepnutí stavu záznamu? Výsledkem
by mělo být:
UPDATE table SET status = !status WHERE id = 123
Následující příklad funguje, ale připadá mi zbytečné kvůli tomu provádět jeden dotaz navíc.
// SomeRepository
public function changeStatus($id)
{
$row = $this->getTable()->wherePrimary($id);
return $row->update(array('archived' => !$row->fetch()->archived));
}
Díky moc za případné rady.
- Filip Procházka
- Moderator | 4668
use Nette\Database\SqlLiteral;
public function changeStatus($id)
{
$row = $this->getTable()->wherePrimary($id);
return $row->update(array('archived' => new SqlLiteral('!archived'));
}
Co takhle? :)
- Tori
- Člen | 32
Díky za nakopnutí. Akorát před vykřičníkem musí být mezera, což
není moc intuitivní (za rovnítko se v dotazu nevloží mezera, takže
vznikne neexistující operátor =!
). A taky ručně escapovat
název sloupce jsem si už celkem odvykla, s tímhle luxusem. :)
Zatím jsem se dostala k tomuhle. Jen nevím, jestli ta syntax s vykřičníkem je použitelná i pro jiné typy databází. (?)
// abstract class Repository
protected function invertValue($column)
{
$sql = $this->connection->getSupplementalDriver()->delimite('archived');
return array($column => new SqlLiteral(' !'.$sql));
}
// NewsRepository extends Repository
return $this->getTable()->wherePrimary($id)->update($this->invertValue('archived'));