Nette databaze vlastní query

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

Zdravím.
Postupuji podle návodu z dokumentace ale chtěl bych si zkonstruovat svůj SQL update:

UPDATE user SET shots=shots+1, points=points+?, successful=points/shots WHERE id=?

Jak na to nejjednodušeji?

Děkuji za rady

jiri.pudil
Nette Blogger | 1028
+
0
-

To jde i přes standardní API Nette\Database, jen ty matematické operace nad sloupci musíš předávat jako SqlLiteral:

use Nette\Database\SqlLiteral;

(...)->where(array('id' => $id))->update(array(
	'shots' => new SqlLiteral('shots+1'),
	'points' => new SqlLiteral("points+$whatever"),
	'successful' => new SqlLiteral('points/shots'),
));

Musíš si ovšem ošetřit $whatever proti SQL injection.

Editoval jiri.pudil (11. 12. 2012 13:00)

motorcb
Člen | 551
+
0
-

jiri.pudil napsal(a):

Díky. Jde to nějak zapsat i vlastním SQL dotazem?

jiri.pudil
Nette Blogger | 1028
+
0
-

Jde.

$db->query($sqlQuery); // $db instanceof Nette\Database\Connection
motorcb
Člen | 551
+
0
-

jiri.pudil:
Díky moc! Jen jak získám to
// $db instanceof Nette\Database\Connection
Nyní dělám dotaz takto: $this->context->user->find( 5 );

enumag
Člen | 2118
+
0
-
/** @var Nette\Database\Connection */
protected $connection;

public function injectConnection(Nette\Database\Connection $connection)
{
	$this->connection = $connection;
}

Ale jedním dechem dodávám, že bys místo Connection měl injectovat raději nějaký model a to Connection používat až v něm.

PS: Používání contextu se v rámci možností raději vyhni. ;-)

Editoval enumag (12. 12. 2012 8:44)