Vícenásobný INSERT .. ON DUPLICATE KEY UPDATE

Samjbc
Člen | 4
+
0
-

Zdravím,

snažím se skrz nette provést vložení – úpravu více řádků najednou, mám:

$insert[] = [
    'id' => 1,
    'user_id' => 2,
    'score' => 500,
    ];
$insert[] = [
    'id' => 1,
    'user_id' => 3,
    'score' => 1200,
    ];
$update[] = [
    'user_id' => 2,
    'score' => 500,
];
$update[] = [
    'user_id' => 3,
    'score' => 1200,
];
$this->database->query('INSERT INTO game', $insert, 'ON DUPLICATE KEY UPDATE', $update);

a výsledkem pak je:

INSERT INTO
  game (`id`, `user_id`, `score`)
VALUES
  (1, 2, 500),
  (1, 3, 1200) ON DUPLICATE KEY
UPDATE
  (`user_id` = 2, `score` = 500),
  (`user_id` = 3, `score` = 1200)

část pri insert se sestaví dobře, ale u update se přidává k jednotlivým řádkům (…).

Jde vůbec takto nějak ukládat řádky? Nebo je nutné si část s update sestavit ručně?

Jan Tvrdík
Nette guru | 2595
+
+1
-

Nechceš spíš něco jako

INSERT INTO
  game (`user_id`, `score`)
VALUES
  (2, 500),
  (3, 1200)
ON DUPLICATE KEY UPDATE score = VALUES(score)

?

Samjbc
Člen | 4
+
+1
-

Jan Tvrdík napsal(a):

Nechceš spíš něco jako

INSERT INTO
  game (`user_id`, `score`)
VALUES
  (2, 500),
  (3, 1200)
ON DUPLICATE KEY UPDATE score = VALUES(score)

?

Díky to je to co potřebuju!

Kdyby někdo řešil to co já, tak tady je kód, sice ne hezký, ale funkční :)

$update = [];
foreach (array_keys(current($data)) as $k) {
	if ($k != $class::COLUMN_ID) {
		$update[] = "$k=VALUES($k)";
	}
}

return $this->database->query('INSERT INTO ' . $class::TABLE_NAME, $data, 'ON DUPLICATE KEY UPDATE ' . implode(',', $update));
Michal Kumžák
Člen | 106
+
+2
-

No já myslím, že to jde napsat ještě lépe. Tohle funguje mě:

$this->database->query("INSERT INTO `tabulka`", $values, "ON DUPLICATE KEY UPDATE", $values);