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
+
0
-

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
+
0
-
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
+
0
-

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'));