From 8a087c8537b2afc8caaeed399ea71477c558cedc Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 12 May 2017 15:55:03 +0300 Subject: [PATCH] #14150: Added {{ and }} to getTablesUsedInFrom() output --- framework/db/ActiveQuery.php | 11 +++--- framework/validators/ExistValidator.php | 2 +- framework/validators/UniqueValidator.php | 4 +- tests/framework/db/ActiveQueryTest.php | 50 ++++++++++++------------ 4 files changed, 34 insertions(+), 33 deletions(-) diff --git a/framework/db/ActiveQuery.php b/framework/db/ActiveQuery.php index 0ab66283e1..1c63568257 100644 --- a/framework/db/ActiveQuery.php +++ b/framework/db/ActiveQuery.php @@ -792,6 +792,7 @@ class ActiveQuery extends Query implements ActiveQueryInterface /** * Returns table names used in [[from]] indexed by aliases. + * Both aliases and names are enclosed into {{ and }}. * @return string[] table names indexed by aliases * @throws \yii\base\InvalidConfigException * @since 2.0.12 @@ -811,18 +812,18 @@ class ActiveQuery extends Query implements ActiveQueryInterface // Clean up table names and aliases $cleanedUpTableNames = []; foreach ($tableNames as $alias => $tableName) { - if (preg_match('~{{(.*?)}}~', $tableName, $matches)) { - $alias = $tableName = $matches[1]; - } - if (!is_string($alias)) { - if (preg_match('~^\s*([\'"`\[].*?[\'"`\]]|\w+)(?:(?:\s+(?:as)?\s*)([\'"`\[].*?[\'"`\]]|\w+))?\s*$~iu', $tableName, $matches)) { + if (preg_match('~\s*({{.*?}})\s*~', $tableName, $matches)) { + $alias = $tableName = $matches[1]; + } elseif (preg_match('~^\s*([\'"`\[].*?[\'"`\]]|\w+)(?:(?:\s+(?:as)?\s*)([\'"`\[].*?[\'"`\]]|\w+))?\s*$~iu', $tableName, $matches)) { if (isset($matches[1])) { if (isset($matches[2])) { list(, $tableName, $alias) = $matches; } else { $tableName = $alias = $matches[1]; } + $alias = '{{' . $alias . '}}'; + $tableName = '{{' . $tableName . '}}'; } } } diff --git a/framework/validators/ExistValidator.php b/framework/validators/ExistValidator.php index e44dfbd54c..7182a8e8cb 100644 --- a/framework/validators/ExistValidator.php +++ b/framework/validators/ExistValidator.php @@ -223,7 +223,7 @@ class ExistValidator extends Validator $primaryTableAlias = $tableAliases[0]; $prefixedConditions = []; foreach ($conditions as $columnName => $columnValue) { - $prefixedColumn = "{{{$primaryTableAlias}}}.[[{$columnName}]]"; + $prefixedColumn = "{$primaryTableAlias}.[[{$columnName}]]"; $prefixedConditions[$prefixedColumn] = $columnValue; } diff --git a/framework/validators/UniqueValidator.php b/framework/validators/UniqueValidator.php index 2cc1d3a173..2c7731e3db 100644 --- a/framework/validators/UniqueValidator.php +++ b/framework/validators/UniqueValidator.php @@ -176,7 +176,7 @@ class UniqueValidator extends Validator $primaryAlias = array_keys($query->getTablesUsedInFrom())[0]; $columns = $targetClass::primaryKey(); foreach($columns as $c => $column) { - $columns[$c] = "{{{$primaryAlias}}}.[[$column]]"; + $columns[$c] = "{$primaryAlias}.[[$column]]"; } $query->select($columns); } @@ -296,7 +296,7 @@ class UniqueValidator extends Validator $primaryTableAlias = $tableAliases[0]; $prefixedConditions = []; foreach ($conditions as $columnName => $columnValue) { - $prefixedColumn = "{{{$primaryTableAlias}}}.[[{$columnName}]]"; + $prefixedColumn = "{$primaryTableAlias}.[[{$columnName}]]"; $prefixedConditions[$prefixedColumn] = $columnValue; } diff --git a/tests/framework/db/ActiveQueryTest.php b/tests/framework/db/ActiveQueryTest.php index beb5af564a..8f3bfe98d8 100644 --- a/tests/framework/db/ActiveQueryTest.php +++ b/tests/framework/db/ActiveQueryTest.php @@ -239,7 +239,7 @@ abstract class ActiveQueryTest extends DatabaseTestCase $tables = $query->getTablesUsedInFrom(); $this->assertEquals([ - Profile::tableName() => Profile::tableName(), + '{{' . Profile::tableName() . '}}' => '{{' . Profile::tableName() . '}}', ], $tables); } @@ -247,17 +247,17 @@ abstract class ActiveQueryTest extends DatabaseTestCase { $query = new ActiveQuery(null); $query->from = [ - 'prf' => 'profile', - 'usr' => 'user', - 'a b' => 'c d', + '{{prf}}' => '{{profile}}', + '{{usr}}' => '{{user}}', + '{{a b}}' => '{{c d}}', ]; $tables = $query->getTablesUsedInFrom(); $this->assertEquals([ - 'prf' => 'profile', - 'usr' => 'user', - 'a b' => 'c d', + '{{prf}}' => '{{profile}}', + '{{usr}}' => '{{user}}', + '{{a b}}' => '{{c d}}', ], $tables); } @@ -269,11 +269,11 @@ abstract class ActiveQueryTest extends DatabaseTestCase $tables = $query->getTablesUsedInFrom(); $this->assertEquals([ - 'prf' => 'profile', - 'usr' => 'user', - 'order' => 'order', - 'customer' => 'customer', - 'c d' => 'a b', + '{{prf}}' => '{{profile}}', + '{{usr}}' => '{{user}}', + '{{order}}' => '{{order}}', + '{{customer}}' => '{{customer}}', + '{{c d}}' => '{{a b}}', ], $tables); } @@ -294,7 +294,7 @@ abstract class ActiveQueryTest extends DatabaseTestCase $tables = $query->getTablesUsedInFrom(); $this->assertEquals([ - Profile::tableName() => Profile::tableName(), + '{{' . Profile::tableName() . '}}' => '{{' . Profile::tableName() . '}}', ], $tables); } @@ -302,17 +302,17 @@ abstract class ActiveQueryTest extends DatabaseTestCase { $query = new ActiveQuery(null); $query->from = [ - 'prf' => 'profile', - 'usr' => 'user', - 'a b' => 'c d', + '{{prf}}' => '{{profile}}', + '{{usr}}' => '{{user}}', + '{{a b}}' => '{{c d}}', ]; $tables = $query->getTablesUsedInFrom(); $this->assertEquals([ - 'prf' => 'profile', - 'usr' => 'user', - 'a b' => 'c d', + '{{prf}}' => '{{profile}}', + '{{usr}}' => '{{user}}', + '{{a b}}' => '{{c d}}', ], $tables); } @@ -324,11 +324,11 @@ abstract class ActiveQueryTest extends DatabaseTestCase $tables = $query->getTablesUsedInFrom(); $this->assertEquals([ - 'prf' => 'profile', - 'usr' => 'user', - 'srv' => 'service', - 'order' => 'order', - 'c d' => 'a b', + '{{prf}}' => '{{profile}}', + '{{usr}}' => '{{user}}', + '{{srv}}' => '{{service}}', + '{{order}}' => '{{order}}', + '{{c d}}' => '{{a b}}', ], $tables); } @@ -353,7 +353,7 @@ abstract class ActiveQueryTest extends DatabaseTestCase $tables = $query->getTablesUsedInFrom(); $this->assertEquals([ - '%order_item' => '%order_item', + '{{%order_item}}' => '{{%order_item}}', ], $tables); } }