From cf0129a19491550bab082818fa8e3a23f00c9f60 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Fri, 6 Apr 2018 02:56:22 +0200 Subject: [PATCH] Translator: improved Expression usage --- src/Dibi/Translator.php | 6 +++++- tests/dibi/Translator.phpt | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Dibi/Translator.php b/src/Dibi/Translator.php index e2f9241b..e3eea42b 100644 --- a/src/Dibi/Translator.php +++ b/src/Dibi/Translator.php @@ -316,7 +316,11 @@ final class Translator if ($modifier) { if ($value !== null && !is_scalar($value)) { // array is already processed if ($value instanceof Literal && ($modifier === 'sql' || $modifier === 'SQL')) { - $modifier = 'SQL'; + return (string) $value; + + } elseif ($value instanceof Expression && $modifier === 'ex') { + return $this->connection->translate(...$value->getValues()); + } elseif ($value instanceof \DateTimeInterface && ($modifier === 'd' || $modifier === 't' || $modifier === 'dt')) { // continue } else { diff --git a/tests/dibi/Translator.phpt b/tests/dibi/Translator.phpt index 35303860..8c7415e5 100644 --- a/tests/dibi/Translator.phpt +++ b/tests/dibi/Translator.phpt @@ -507,6 +507,18 @@ Assert::same( ); +Assert::same( + reformat('SELECT * FROM [table] WHERE (([left] = 1) OR ([top] = 2)) AND (number < 100)'), + $conn->translate('SELECT * FROM `table` WHERE %and', [ + new Dibi\Expression('%or', [ + 'left' => 1, + 'top' => 2, + ]), + new Dibi\Expression('number < %i', 100), + ]) +); + + $e = Assert::exception(function () use ($conn) { $array6 = [ 'id' => [1, 2, 3, 4],