Nette\Database – ON DUPLICATE KEY – vypnutí escapování

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

Zdravím,
snažím se vytvořit SQL dotaz ON DUPLICATE KEY UPDATENette\Database pomocí query(). Dotaz používám na přeřazení odkazů v navigaci. Z frontendu se po změně pořadí posílá POST, zpracuje se v handle a pokračuje do modelu. V modelu mám fnci která jako parametr dostane zpracované pořadí:

array(
	array('id' => 5, 'parent_id' => NULL, 'order' => 1),
	array('id' => 6, 'parent_id' => NULL, 'order' => 2),
	array('id' => 7, 'parent_id' => 5, 'order' => 1)
);

Funkce vypadá takto:

public function reorderNavigationLinks(array $linksArray)
{
	// search for columns to update
	$keys = array_keys(array_values($linksArray)[0]);

	// join keys for update statement
	$updateStatement = array();
	foreach ($keys as $key)
		$updateStatement[$key] = "VALUES($key)";

	try {
		// insert new navigation links or update existing
		$result = $this->database->query('INSERT INTO navigations_links', $linksArray, ' ON DUPLICATE KEY UPDATE ',$updateStatement);

		if (!$result)
			throw new Nette\Application\ApplicationException("An error occurred while saving data!");

	} catch (\PDOException $e) {
		throw new Nette\Application\ApplicationException("An error occurred while saving data!");
	}
}

Problém je, že při generování SQL dotazu se escapují i hodnoty VALUES($key) a pak následovný dotaz vypadá:

INSERT INTO navigations_links (`id`, `parent_id`, `order`)
VALUES (6, NULL, 1), (5, NULL, 2), (7, 5, 1) ON DUPLICATE KEY
UPDATE `id`='VALUES(id)', `parent_id`='VALUES(parent_id)', `order`='VALUES(order)'

Dotaz tedy zní: jestli se dá nějak vypnout escapování pro jeden paremetr, a nebo raději místo $updateStatement tam hodit přímo string, který bude obsahovat id=VALUES(id), parent_id=VALUES(parent_id), … ?

David Matějka
Moderator | 6445
+
+3
-

zkus pouzit:

$updateStatement[$key] = new Nette\Database\SqlLiteral("VALUES($key)");
VojtaSim
Člen | 55
+
0
-

Díky moc, pomohlo :D