Skip to content

Commit f859e51

Browse files
committed
Fix upsert
1 parent d844e66 commit f859e51

File tree

2 files changed

+13
-5
lines changed

2 files changed

+13
-5
lines changed

packages/database/src/Manager/WriterManager.php

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,11 @@ public function upsert(
229229

230230
$table = (string) $query->quoteName($table);
231231
$data = TypeCast::toArray($data);
232-
$quotedFields = $query->qnMultiple(array_keys($data));
232+
$allFields = array_keys($data);
233+
$valueFields = array_filter($allFields, fn($field) => !in_array($field, $keys, true));
234+
235+
$quotedFields = $query->qnMultiple($allFields);
236+
$quotedValueFields = $query->qnMultiple($valueFields);
233237
$quotedKeys = $query->qnMultiple($keys);
234238

235239
$columns = $query->clause('()', $quotedFields, ',');
@@ -248,7 +252,7 @@ public function upsert(
248252
case AbstractPlatform::MYSQL:
249253
$dupKeys = $query->clause('', [], ',');
250254

251-
foreach ($quotedKeys as $key) {
255+
foreach ($quotedValueFields as $key) {
252256
$dupKeys->append("$key = VALUES($key)");
253257
}
254258

@@ -266,12 +270,12 @@ public function upsert(
266270
$dupKeys = $query->clause('()', [], ',');
267271

268272
foreach ($quotedKeys as $key) {
269-
$dupKeys->append("$key = VALUES($key)");
273+
$dupKeys->append($key);
270274
}
271275

272276
$excludeKeys = $query->clause('', [], ',');
273277

274-
foreach ($quotedKeys as $key) {
278+
foreach ($quotedValueFields as $key) {
275279
$excludeKeys->append("$key = EXCLUDED.$key");
276280
}
277281

@@ -308,7 +312,9 @@ public function upsert(
308312

309313
$updateSet = $query->clause('', [], ',');
310314

311-
foreach ($data as $k => $v) {
315+
foreach ($valueFields as $k) {
316+
$v = $data[$k];
317+
312318
if ($v instanceof RawWrapper) {
313319
$updateSet->append($query->quoteName($k) . '=' . $v());
314320
} else {

packages/orm/src/EntityMapper.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,6 +1005,8 @@ public function upsert(
10051005

10061006
$metadata = $this->getMetadata();
10071007

1008+
$updateNulls = true;
1009+
10081010
// $updateNulls = $options->updateNulls;
10091011
// if ($this->metadata::isEntity($item)) {
10101012
// $updateNulls = true;

0 commit comments

Comments
 (0)