Skip to content

Commit 4fcb879

Browse files
committed
CHG Upsert disables update action if update column is empty array
1 parent 9941216 commit 4fcb879

File tree

4 files changed

+17
-14
lines changed

4 files changed

+17
-14
lines changed

src/DatabaseHandler.php

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -202,11 +202,7 @@ public function executeUpsert(UpsertQuery $query): UpsertResult
202202
$keys = array_combine($keys, $keys);
203203

204204
// Creates a transaction to prevent concurrent failures.
205-
$transactionStarted = false;
206-
if (!$this->inTransaction()) {
207-
$this->startTransaction();
208-
$transactionStarted = true;
209-
}
205+
$this->startTransaction();
210206

211207
// Finds all rows that can match.
212208
$index = new Index($query, $keys);
@@ -246,7 +242,7 @@ public function executeUpsert(UpsertQuery $query): UpsertResult
246242
$insertedId = $insertResult->getInsertedId();
247243
$success &= $insertResult->success();
248244
}
249-
if (!empty($updates)) {
245+
if (!empty($updates) && !empty($query->getUpdateColumns())) {
250246
foreach ($updates as $u) {
251247
$updateQuery = Query::update($query->getTable(), $u, $query->getKeys(), $query->getUpdateColumns());
252248
$updateResult = $this->executeUpdate($updateQuery);
@@ -256,9 +252,8 @@ public function executeUpsert(UpsertQuery $query): UpsertResult
256252
}
257253

258254
// Commits transaction if this started inside this method.
259-
if ($transactionStarted) {
260-
$this->commit();
261-
}
255+
$this->commit();
256+
262257
return new UpsertResult($inserts, $updates, $numInserts, $numUpdates, $insertedId, true);
263258
}
264259

src/Query.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public static function update($table, $data = null, ?array $matching = null, ?ar
8484
{
8585
return UpdateQuery::createUpdate($table, $data, $matching, $columns);
8686
}
87-
public static function upsert($table, $data = null, array $keys = [], array $columns = [])
87+
public static function upsert($table, $data = null, array $keys = [], ?array $columns = null)
8888
{
8989
return new UpsertQuery(Table::fromExpression($table), $data, $keys, $columns);
9090
}

src/UpsertQuery.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ class UpsertQuery implements Iterator, Countable
1515
private $keys = [];
1616
private $columns = [];
1717

18-
public function __construct($table = null, $values = null, array $keys = [], array $columns = [])
18+
public function __construct($table = null, $values = null, array $keys = [], ?array $columns = null)
1919
{
2020
if (isset($table)) {
2121
$this->setTable($table);
2222
}
2323
if (isset($values)) {
24-
$cols = empty($columns) ? [] : array_merge($keys, $columns);
24+
$cols = isset($columns) ? array_merge($keys, $columns) : $columns;
2525
$this->setValues($values, $cols);
2626
}
2727
$this->keys = $keys;
@@ -51,9 +51,12 @@ private static function normalizeColumns(array $columns = [])
5151
return $newColumns;
5252
}
5353

54-
public function setValues($values, array $columns = [])
54+
public function setValues($values, ?array $columns = null)
5555
{
56-
$columns = static::normalizeColumns($columns);
56+
if (is_array($columns) && empty($columns)) {
57+
return;
58+
}
59+
$columns = static::normalizeColumns($columns ?? []);
5760
if (is_array($values) && count(array_filter(array_keys($values), 'is_int')) > 0) {
5861
foreach ($values as $row) {
5962
$this->setValues($row, $columns);

test/UpsertQueryTest.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,10 @@ public function testUpsertColumns()
2929
$this->assertEquals(['user_id', 'username', 'password', 'enabled'], $query->getColumns());
3030
$this->assertEquals(['user_id'], $query->getKeys());
3131
$this->assertEquals(['username', 'password', 'enabled'], $query->getUpdateColumns());
32+
33+
$query = Query::upsert('users', $obj, ['username', 'enabled'], []);
34+
$this->assertEquals(['username', 'enabled'], $query->getColumns());
35+
$this->assertEquals(['username', 'enabled'], $query->getKeys());
36+
$this->assertEquals([], $query->getUpdateColumns());
3237
}
3338
}

0 commit comments

Comments
 (0)