From 32c1ffc68dc3dc949ae2ddc0c3b918b5a4569d1d Mon Sep 17 00:00:00 2001 From: kenjis Date: Fri, 1 Jul 2022 18:16:00 +0900 Subject: [PATCH] fix: Builder update() does not accept an object --- system/Database/BaseBuilder.php | 5 ++-- tests/system/Database/Builder/UpdateTest.php | 28 ++++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/system/Database/BaseBuilder.php b/system/Database/BaseBuilder.php index 939a1dd6c874..980e5645b1c4 100644 --- a/system/Database/BaseBuilder.php +++ b/system/Database/BaseBuilder.php @@ -2014,11 +2014,12 @@ public function getCompiledUpdate(bool $reset = true) /** * Compiles an update string and runs the query. * - * @param mixed $where + * @param null|array|object $set + * @param array|RawSql|string|null $where * * @throws DatabaseException */ - public function update(?array $set = null, $where = null, ?int $limit = null): bool + public function update($set = null, $where = null, ?int $limit = null): bool { if ($set !== null) { $this->set($set); diff --git a/tests/system/Database/Builder/UpdateTest.php b/tests/system/Database/Builder/UpdateTest.php index 5af1490f6f66..55eec68b8f2a 100644 --- a/tests/system/Database/Builder/UpdateTest.php +++ b/tests/system/Database/Builder/UpdateTest.php @@ -34,11 +34,35 @@ protected function setUp(): void $this->db = new MockConnection([]); } - public function testUpdate() + public function testUpdateArray() { $builder = new BaseBuilder('jobs', $this->db); - $builder->testMode()->where('id', 1)->update(['name' => 'Programmer'], null, null); + $data = ['name' => 'Programmer']; + $builder->testMode()->where('id', 1)->update($data, null, null); + + $expectedSQL = 'UPDATE "jobs" SET "name" = \'Programmer\' WHERE "id" = 1'; + $expectedBinds = [ + 'id' => [ + 1, + true, + ], + 'name' => [ + 'Programmer', + true, + ], + ]; + + $this->assertSame($expectedSQL, str_replace("\n", ' ', $builder->getCompiledUpdate())); + $this->assertSame($expectedBinds, $builder->getBinds()); + } + + public function testUpdateObject() + { + $builder = new BaseBuilder('jobs', $this->db); + + $data = (object) ['name' => 'Programmer']; + $builder->testMode()->where('id', 1)->update($data, null, null); $expectedSQL = 'UPDATE "jobs" SET "name" = \'Programmer\' WHERE "id" = 1'; $expectedBinds = [