diff --git a/application/Espo/ORM/Query/UpdateBuilder.php b/application/Espo/ORM/Query/UpdateBuilder.php index f8abfbb32d..a0921705be 100644 --- a/application/Espo/ORM/Query/UpdateBuilder.php +++ b/application/Espo/ORM/Query/UpdateBuilder.php @@ -29,6 +29,7 @@ namespace Espo\ORM\Query; +use Espo\ORM\Query\Part\Expression; use RuntimeException; class UpdateBuilder implements Builder @@ -78,11 +79,25 @@ class UpdateBuilder implements Builder /** * Values to set. Column => Value map. * - * @param array $set + * @param array $set */ public function set(array $set): self { - $this->params['set'] = $set; + $modified = []; + + foreach ($set as $key => $value) { + if (!$value instanceof Expression) { + $modified[$key] = $value; + + continue; + } + + $newKey = rtrim($key, ':') . ':'; + + $modified[$newKey] = $value->getValue(); + } + + $this->params['set'] = $modified; return $this; } diff --git a/tests/unit/Espo/ORM/MysqlQueryComposerTest.php b/tests/unit/Espo/ORM/MysqlQueryComposerTest.php index dd0b611224..9a0402e803 100644 --- a/tests/unit/Espo/ORM/MysqlQueryComposerTest.php +++ b/tests/unit/Espo/ORM/MysqlQueryComposerTest.php @@ -339,6 +339,27 @@ class MysqlQueryComposerTest extends \PHPUnit\Framework\TestCase $this->assertEquals($expectedSql, $sql); } + public function testUpdateQueryWithSetExpression() + { + $query = $this->queryBuilder + ->update() + ->in('Comment') + ->join('post') + ->set([ + 'name' => Expression::column('post.name'), + ]) + ->build(); + + $sql = $this->query->composeUpdate($query); + + $expectedSql = + "UPDATE `comment` " . + "JOIN `post` AS `post` ON comment.post_id = post.id ". + "SET comment.name = post.name"; + + $this->assertEquals($expectedSql, $sql); + } + public function testInsertQuery1() { $sql = $this->query->compose(Insert::fromRaw([ diff --git a/tests/unit/Espo/ORM/QueryBuilderTest.php b/tests/unit/Espo/ORM/QueryBuilderTest.php index f7c748af62..bbb231d7b9 100644 --- a/tests/unit/Espo/ORM/QueryBuilderTest.php +++ b/tests/unit/Espo/ORM/QueryBuilderTest.php @@ -29,15 +29,14 @@ namespace tests\unit\Espo\ORM; -use Espo\ORM\{ - QueryBuilder, - Query\Select, - Query\Insert, - Query\Update, - Query\Delete, - Query\Union, - Query\Part\Selection, -}; +use Espo\ORM\Query\Delete; +use Espo\ORM\Query\Insert; +use Espo\ORM\Query\Part\Expression; +use Espo\ORM\Query\Part\Selection; +use Espo\ORM\Query\Select; +use Espo\ORM\Query\Union; +use Espo\ORM\Query\Update; +use Espo\ORM\QueryBuilder; use RuntimeException; @@ -218,6 +217,23 @@ class QueryBuilderTest extends \PHPUnit\Framework\TestCase ->build(); } + public function testUpdate2() + { + $update = $this->queryBuilder + ->update() + ->in('Test') + ->set(['col' => Expression::add(1, 2)]) + ->build(); + + $this->assertInstanceOf(Update::class, $update); + + + $this->assertEquals( + ['col:' => 'ADD:(1, 2)'], + $update->getRaw()['set'] + ); + } + public function testUnion1() { $q1 = $this->queryBuilder