Vícenásobný INSERT .. ON DUPLICATE KEY UPDATE
- Samjbc
- Člen | 4
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
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
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
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);