From 0333b3944f740bcf445d36c48c132c21300cbebf Mon Sep 17 00:00:00 2001 From: Falaleev Maxim Date: Mon, 5 Feb 2018 11:46:55 +0300 Subject: [PATCH] New QueryBuilder --- AbstractModel.php | 15 ++-- Callback/JoinCallback.php | 2 +- Callback/LookupCallback.php | 2 +- Makefile | 5 ++ ManyToManyManager.php | 19 ++-- QuerySet.php | 12 +-- QuerySetBase.php | 2 +- Sync.php | 6 +- Tests/Basic/CrudTest.php | 11 +-- Tests/Databases/Mysql/MysqlLookupTest.php | 38 ++++---- .../Pgsql/PgsqlLookupRelationTest.php | 44 ++++----- Tests/Databases/Pgsql/PgsqlLookupTest.php | 55 ++++++------ .../Sqlite/SqliteLookupRelationTest.php | 43 +++++++++ Tests/Fields/ForeignFieldTest.php | 4 +- Tests/Fields/HasManyFieldTest.php | 2 +- Tests/Fields/ManyToManyFieldTest.php | 15 ++-- Tests/QueryBuilder/LookupRelationTest.php | 42 ++++----- Tests/QueryBuilder/LookupTest.php | 90 +++++++++---------- Tests/QueryBuilder/QuerySetTest.php | 2 +- Tests/QueryBuilder/QueryTest.php | 8 +- Tests/QueryBuilder/SubqueriesTest.php | 4 +- composer.json | 2 +- phpunit.xml.dist | 1 - 23 files changed, 241 insertions(+), 183 deletions(-) create mode 100644 Makefile diff --git a/AbstractModel.php b/AbstractModel.php index 12bece05..354c7b74 100644 --- a/AbstractModel.php +++ b/AbstractModel.php @@ -79,7 +79,8 @@ protected function insertInternal(array $fields = []) $tableName = $qb->getQuotedName(TableNameResolver::getTableName($this->tableName())); $sql = $qb - ->insert($tableName) + ->insert() + ->table($tableName) ->values($values) ->toSQL(); $inserted = $connection->executeUpdate($sql); @@ -88,13 +89,11 @@ protected function insertInternal(array $fields = []) } foreach (self::getMeta()->getPrimaryKeyName(true) as $primaryKeyName) { - foreach (self::getMeta()->getPrimaryKeyName(true) as $primaryKeyName) { - if ( - empty($this->getAttribute($this->getSequenceName())) || - in_array($primaryKeyName, $dirty) === false - ) { - $values[$primaryKeyName] = $connection->lastInsertId($this->getSequenceName()); - } + if ( + empty($this->getAttribute($this->getSequenceName())) || + in_array($primaryKeyName, $dirty) === false + ) { + $values[$primaryKeyName] = $connection->lastInsertId($this->getSequenceName()); } } diff --git a/Callback/JoinCallback.php b/Callback/JoinCallback.php index 2a3610e6..c7f3a6ab 100644 --- a/Callback/JoinCallback.php +++ b/Callback/JoinCallback.php @@ -13,7 +13,7 @@ use Mindy\Orm\Fields\ManyToManyField; use Mindy\Orm\Fields\RelatedField; use Mindy\Orm\ModelInterface; -use Mindy\QueryBuilder\LookupBuilder\LookupBuilder; +use Mindy\QueryBuilder\LookupBuilder; use Mindy\QueryBuilder\QueryBuilder; class JoinCallback diff --git a/Callback/LookupCallback.php b/Callback/LookupCallback.php index 2e84504f..fbfb99e3 100644 --- a/Callback/LookupCallback.php +++ b/Callback/LookupCallback.php @@ -14,7 +14,7 @@ use Mindy\Orm\Fields\RelatedField; use Mindy\Orm\Model; use Mindy\Orm\ModelInterface; -use Mindy\QueryBuilder\LookupBuilder\LookupBuilder; +use Mindy\QueryBuilder\LookupBuilder; use Mindy\QueryBuilder\QueryBuilder; class LookupCallback diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..adf45da0 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +test: + php ./vendor/bin/phpunit + +test-coverage: + php -dzend_extension=/usr/local/opt/php71-xdebug/xdebug.so ./vendor/bin/phpunit --coverage-html=./coverage diff --git a/ManyToManyManager.php b/ManyToManyManager.php index 6c48dd85..f668ed19 100644 --- a/ManyToManyManager.php +++ b/ManyToManyManager.php @@ -12,6 +12,8 @@ use Exception; use Mindy\QueryBuilder\QueryBuilder; +use Mindy\QueryBuilder\QueryBuilderFactory; +use Mindy\QueryBuilder\Utils\TableNameResolver; /** * Class ManyToManyManager. @@ -87,9 +89,9 @@ public function clean() throw new Exception('Unable to clean models: the primary key of '.get_class($this->primaryModel).' is null.'); } $db = $this->primaryModel->getConnection(); - $adapter = QueryBuilder::getInstance($db)->getAdapter(); + $builder = QueryBuilderFactory::getQueryBuilder($db); - return $db->delete($adapter->quoteTableName($adapter->getRawTableName($this->relatedTable)), [$this->primaryModelColumn => $this->primaryModel->pk]); + return $db->delete($builder->getQuotedName(TableNameResolver::getTableName($this->relatedTable)), [$this->primaryModelColumn => $this->primaryModel->pk]); } /** @@ -125,16 +127,21 @@ protected function linkUnlinkProcess(Model $model, $link = true, array $extra = return $through->pk; } $db = $this->primaryModel->getConnection(); - $builder = QueryBuilder::getInstance($db); + $builder = QueryBuilderFactory::getQueryBuilder($db); $data = array_merge([ $this->primaryModelColumn => $this->primaryModel->pk, $this->modelColumn => $model->pk, ], $extra); - $adapter = $builder->getAdapter(); if ($link) { - $state = $model->getConnection()->insert($adapter->quoteTableName($adapter->getRawTableName($this->relatedTable)), $data); + $state = $model->getConnection()->insert( + $builder->getQuotedName(TableNameResolver::getTableName($this->relatedTable)), + $data + ); } else { - $state = $model->getConnection()->delete($adapter->quoteTableName($adapter->getRawTableName($this->relatedTable)), $data); + $state = $model->getConnection()->delete( + $builder->getQuotedName(TableNameResolver::getTableName($this->relatedTable)), + $data + ); } return $state; diff --git a/QuerySet.php b/QuerySet.php index b1684a9d..09080acf 100755 --- a/QuerySet.php +++ b/QuerySet.php @@ -564,18 +564,18 @@ public function delete() */ public function deleteSql() { - // if ($this->filterHasJoin()) { +// if ($this->filterHasJoin()) { // $this->prepareConditions(); // return $this->createCommand()->delete($tableName, [ // $this->getPrimaryKeyName() => $this->valuesList(['pk'], true) // ], $this->params); // } - $builder = $this->getQueryBuilder() - ->setTypeDelete() - ->setAlias(null); - - return $builder->toSQL(); + return $this + ->getQueryBuilder() + ->delete($this->getModel()->tableName()) + ->setAlias(null) + ->toSQL(); } /** diff --git a/QuerySetBase.php b/QuerySetBase.php index 711591af..d856928c 100644 --- a/QuerySetBase.php +++ b/QuerySetBase.php @@ -134,7 +134,7 @@ public function getQueryBuilder() $builder->setAlias($this->getTableAlias()); $model = $this->getModel(); $meta = $model->getMeta(); - $builder->from($model->tableName()); + $builder->table($model->tableName()); $fetchColumnCallback = new FetchColumnCallback($model, $meta); $callback = new LookupCallback($model); diff --git a/Sync.php b/Sync.php index 0080270e..6e95e749 100644 --- a/Sync.php +++ b/Sync.php @@ -125,16 +125,16 @@ public function dropTable(ModelInterface $model) $model->setConnection($this->connection); - $adapter = $this->getQueryBuilder()->getAdapter(); + $builder = $this->getQueryBuilder(); // $this->connection->executeUpdate($adapter->sqlCheckIntegrity(false, 'public', $model->tableName())); $schemaManager = $this->connection->getSchemaManager(); foreach ($model->getMeta()->getManyToManyFields() as $field) { if ($field->through === null) { - $fieldTable = $adapter->getRawTableName($field->getTableName()); + $fieldTable = TableNameResolver::getTableName($field->getTableName()); if ($this->hasTable($fieldTable)) { - $schemaManager->dropTable($adapter->quoteTableName($fieldTable)); + $schemaManager->dropTable($builder->getQuotedName($fieldTable)); $i += 1; } } diff --git a/Tests/Basic/CrudTest.php b/Tests/Basic/CrudTest.php index 5950d8da..67362d46 100644 --- a/Tests/Basic/CrudTest.php +++ b/Tests/Basic/CrudTest.php @@ -15,6 +15,8 @@ use Mindy\Orm\Tests\Models\User; use Mindy\Orm\Tests\OrmDatabaseTestCase; use Mindy\QueryBuilder\QueryBuilder; +use Mindy\QueryBuilder\QueryBuilderFactory; +use Mindy\QueryBuilder\Utils\TableNameResolver; abstract class CrudTest extends OrmDatabaseTestCase { @@ -26,9 +28,8 @@ public function getModels() public function testLastInsertId() { $c = $this->getConnection(); - $adapter = QueryBuilder::getInstance($c)->getAdapter(); $model = new User(); - $tableName = $adapter->getRawTableName($model->tableName()); + $tableName = TableNameResolver::getTableName($model->tableName()); $c->insert($tableName, ['username' => 'foo']); $this->assertEquals(1, $c->lastInsertId($model->getSequenceName())); } @@ -39,8 +40,8 @@ public function testBrokenLastInsertId() $this->markTestSkipped('mysql specific test'); } $c = $this->getConnection(); - $adapter = QueryBuilder::getInstance($c)->getAdapter(); - $c->insert($adapter->quoteTableName($adapter->getRawTableName(User::tableName())), ['username' => 'foo']); + $builder = QueryBuilderFactory::getQueryBuilder($c); + $c->insert($builder->getQuotedName(TableNameResolver::getTableName(User::tableName())), ['username' => 'foo']); // Выполняется запрос после INSERT $c->query('SELECT 1+1')->fetchAll(); @@ -332,7 +333,7 @@ public function testIssue11() ]); $this->assertEquals(1, $modelOne->pk); $sql = Solution::objects()->filter(['id' => '1'])->updateSql(['status' => 2]); - $this->assertSql("UPDATE [[solution]] SET [[status]]=2 WHERE ([[id]]='1')", $sql); + $this->assertSql("UPDATE [[solution]] SET status = '2' WHERE (id = '1')", $sql); $this->dropModels([new Solution()], $this->getConnection()); } diff --git a/Tests/Databases/Mysql/MysqlLookupTest.php b/Tests/Databases/Mysql/MysqlLookupTest.php index e367fe92..7e246d71 100644 --- a/Tests/Databases/Mysql/MysqlLookupTest.php +++ b/Tests/Databases/Mysql/MysqlLookupTest.php @@ -23,13 +23,13 @@ public function testYear() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-29 10:35:45']))->save()); $qs = ProductList::objects()->filter(['date_action__year' => 2014]); - $this->assertSql( - 'SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(YEAR FROM [[product_list_1]].[[date_action]])=@2014@)', + $this->assertSame( + 'SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(YEAR FROM product_list_1.date_action) = \'2014\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__year' => '2012']); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(YEAR FROM [[product_list_1]].[[date_action]])=@2012@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(YEAR FROM product_list_1.date_action) = \'2012\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -39,11 +39,11 @@ public function testMonth() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-02-28 10:35:45']))->save()); $qs = ProductList::objects()->filter(['date_action__month' => 4]); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(MONTH FROM [[product_list_1]].[[date_action]])=@4@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(MONTH FROM product_list_1.date_action) = \'4\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__month' => '3']); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(MONTH FROM [[product_list_1]].[[date_action]])=@3@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(MONTH FROM product_list_1.date_action) = \'3\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -53,11 +53,11 @@ public function testDay() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-28 10:35:45']))->save()); $qs = ProductList::objects()->filter(['date_action__day' => 29]); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(DAY FROM [[product_list_1]].[[date_action]])=@29@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(DAY FROM product_list_1.date_action) = \'29\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__day' => '30']); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(DAY FROM [[product_list_1]].[[date_action]])=@30@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(DAY FROM product_list_1.date_action) = \'30\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -67,11 +67,11 @@ public function testWeekDay() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-28 10:35:45']))->save()); $qs = ProductList::objects()->filter(['date_action__week_day' => 2]); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (DAYOFWEEK([[product_list_1]].[[date_action]])=@3@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (DAYOFWEEK(product_list_1.date_action) = \'3\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__week_day' => '5']); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (DAYOFWEEK([[product_list_1]].[[date_action]])=@6@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (DAYOFWEEK(product_list_1.date_action) = \'6\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -81,11 +81,11 @@ public function testHour() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-28 9:35:45']))->save()); $qs = ProductList::objects()->filter(['date_action__hour' => 10]); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(HOUR FROM [[product_list_1]].[[date_action]])=@10@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(HOUR FROM product_list_1.date_action) = \'10\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__hour' => '11']); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(HOUR FROM [[product_list_1]].[[date_action]])=@11@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(HOUR FROM product_list_1.date_action) = \'11\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -95,11 +95,11 @@ public function testMinute() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-28 10:34:45']))->save()); $qs = ProductList::objects()->filter(['date_action__minute' => 35]); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(MINUTE FROM [[product_list_1]].[[date_action]])=@35@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(MINUTE FROM product_list_1.date_action) = \'35\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__minute' => '36']); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(MINUTE FROM [[product_list_1]].[[date_action]])=@36@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(MINUTE FROM product_list_1.date_action) = \'36\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -109,11 +109,11 @@ public function testSecond() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-28 10:35:45']))->save()); $qs = ProductList::objects()->filter(['date_action__second' => 45]); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(SECOND FROM [[product_list_1]].[[date_action]])=@45@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(SECOND FROM product_list_1.date_action) = \'45\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__second' => '46']); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(SECOND FROM [[product_list_1]].[[date_action]])=@46@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(SECOND FROM product_list_1.date_action) = \'46\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -123,11 +123,11 @@ public function testRegex() $this->assertTrue((new ProductList(['name' => '@@@', 'date_action' => '2013-03-28 10:35:45']))->save()); $qs = ProductList::objects()->filter(['name__regex' => '[a-z]']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (BINARY [[product_list_1]].[[name]] REGEXP '[a-z]')", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (BINARY product_list_1.name REGEXP '[a-z]')", $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['name__regex' => '[0-9]']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (BINARY [[product_list_1]].[[name]] REGEXP '[0-9]')", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (BINARY product_list_1.name REGEXP '[0-9]')", $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -137,11 +137,11 @@ public function testIregex() $this->assertTrue((new ProductList(['name' => '@@@', 'date_action' => '2013-03-28 10:35:45']))->save()); $qs = ProductList::objects()->filter(['name__iregex' => '[A-Z]']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[name]] REGEXP '[A-Z]')", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.name REGEXP '[A-Z]')", $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['name__iregex' => '[0-9]']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[name]] REGEXP '[0-9]')", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.name REGEXP '[0-9]')", $qs->countSql()); $this->assertEquals(0, $qs->count()); } } diff --git a/Tests/Databases/Pgsql/PgsqlLookupRelationTest.php b/Tests/Databases/Pgsql/PgsqlLookupRelationTest.php index 1bd56bd7..3f1b515c 100644 --- a/Tests/Databases/Pgsql/PgsqlLookupRelationTest.php +++ b/Tests/Databases/Pgsql/PgsqlLookupRelationTest.php @@ -19,6 +19,25 @@ class PgsqlLookupRelationTest extends LookupRelationTest { public $driver = 'pgsql'; + public function testManyLookup() + { + $user = new User(['username' => 'foo']); + $this->assertTrue($user->save()); + + $customer = new Customer(['address' => 'test', 'user' => $user]); + $this->assertTrue($customer->save()); + + $group = new Group(['name' => 'example']); + $this->assertTrue($group->save()); + $user->groups->link($group); + + $qs = Customer::objects()->filter(['user__groups__name' => 'example']); + $sql = $qs->allSql(); + $this->assertSame('SELECT customer_1.* FROM customer AS customer_1 LEFT JOIN users AS users_1 ON customer_1.user_id=users_1.id LEFT JOIN membership AS membership_1 ON membership_1.user_id=users_1.id LEFT JOIN "group" AS group_1 ON group_1.id=membership_1.group_id WHERE (group_1.name = \'example\')', $sql); + $this->assertEquals(1, $qs->count()); + $this->assertEquals(['id' => '1', 'user_id' => '1', 'address' => 'test'], $qs->asArray()->all()[0]); + } + public function testSimpleLookup() { $user = new User(['username' => 'foo']); @@ -28,11 +47,7 @@ public function testSimpleLookup() $this->assertTrue($customer->save()); $sql = Customer::objects()->filter(['user__username__startswith' => 't'])->allSql(); - $this->assertSql( - 'SELECT [[customer_1]].* -FROM [[customer]] AS [[customer_1]] -LEFT JOIN [[users]] AS [[users_1]] ON [[customer_1]].[[user_id]]=[[users_1]].[[id]] -WHERE ([[users_1]].[[username]]::text LIKE @t%@)', $sql); + $this->assertSame('SELECT customer_1.* FROM customer AS customer_1 LEFT JOIN users AS users_1 ON customer_1.user_id=users_1.id WHERE (users_1.username::text LIKE \'t%\')', $sql); } public function testManyLookupAnother() @@ -49,11 +64,7 @@ public function testManyLookupAnother() $qs = User::objects()->filter(['addresses__address__contains' => 'test']); $sql = $qs->allSql(); - $this->assertSql( - 'SELECT [[users_1]].* -FROM [[users]] AS [[users_1]] -LEFT JOIN [[customer]] AS [[customer_1]] ON [[customer_1]].[[user_id]]=[[users_1]].[[id]] -WHERE ([[customer_1]].[[address]]::text LIKE @%test%@)', $sql); + $this->assertSame('SELECT users_1.* FROM users AS users_1 LEFT JOIN customer AS customer_1 ON customer_1.user_id=users_1.id WHERE (customer_1.address::text LIKE \'%test%\')', $sql); $this->assertEquals(1, $qs->count()); } @@ -74,12 +85,7 @@ public function testManyLookupMultiple() 'groups__pk' => '1', ]); $sql = $qs->allSql(); - $this->assertSql( - 'SELECT [[users_1]].* FROM [[users]] AS [[users_1]] -LEFT JOIN [[customer]] AS [[customer_1]] ON [[customer_1]].[[user_id]]=[[users_1]].[[id]] -LEFT JOIN [[membership]] AS [[membership_1]] ON [[membership_1]].[[user_id]]=[[users_1]].[[id]] -LEFT JOIN [[group]] AS [[group_1]] ON [[group_1]].[[id]]=[[membership_1]].[[group_id]] -WHERE (([[customer_1]].[[address]]::text LIKE @%test%@) AND ([[group_1]].[[id]]=@1@))', $sql); + $this->assertSame('SELECT users_1.* FROM users AS users_1 LEFT JOIN customer AS customer_1 ON customer_1.user_id=users_1.id LEFT JOIN membership AS membership_1 ON membership_1.user_id=users_1.id LEFT JOIN "group" AS group_1 ON group_1.id=membership_1.group_id WHERE ((customer_1.address::text LIKE \'%test%\') AND (group_1.id = \'1\'))', $sql); $this->assertEquals(1, $qs->count()); } @@ -89,10 +95,6 @@ public function testPgsqlManyLookupMultiple() 'groups__pk' => '1', ]); $sql = $qs->allSql(); - $this->assertSql( - 'SELECT [[users_1]].* FROM [[users]] AS [[users_1]] -LEFT JOIN [[membership]] AS [[membership_1]] ON [[membership_1]].[[user_id]]=[[users_1]].[[id]] -LEFT JOIN [[group]] AS [[group_1]] ON [[group_1]].[[id]]=[[membership_1]].[[group_id]] -WHERE ([[group_1]].[[id]]=@1@)', $sql); + $this->assertSame('SELECT users_1.* FROM users AS users_1 LEFT JOIN membership AS membership_1 ON membership_1.user_id=users_1.id LEFT JOIN "group" AS group_1 ON group_1.id=membership_1.group_id WHERE (group_1.id = \'1\')', $sql); } } diff --git a/Tests/Databases/Pgsql/PgsqlLookupTest.php b/Tests/Databases/Pgsql/PgsqlLookupTest.php index a62637cf..5aa57afa 100644 --- a/Tests/Databases/Pgsql/PgsqlLookupTest.php +++ b/Tests/Databases/Pgsql/PgsqlLookupTest.php @@ -10,8 +10,11 @@ namespace Mindy\Orm\Tests\Databases\Pgsql; +use Mindy\Orm\Tests\Models\Customer; +use Mindy\Orm\Tests\Models\Group; use Mindy\Orm\Tests\Models\Product; use Mindy\Orm\Tests\Models\ProductList; +use Mindy\Orm\Tests\Models\User; use Mindy\Orm\Tests\QueryBuilder\LookupTest; class PgsqlLookupTest extends LookupTest @@ -28,11 +31,11 @@ public function testYear() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2012-03-29 10:35:45']))->save()); $qs = ProductList::objects()->filter(['date_action__year' => 2014]); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(YEAR FROM [[product_list_1]].[[date_action]]::timestamp)=@2014@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(YEAR FROM product_list_1.date_action::timestamp) = \'2014\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__year' => '2013']); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(YEAR FROM [[product_list_1]].[[date_action]]::timestamp)=@2013@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(YEAR FROM product_list_1.date_action::timestamp) = \'2013\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -43,11 +46,11 @@ public function testMonth() $qs = ProductList::objects()->filter(['date_action__month' => 4]); $this->assertEquals(1, $qs->count()); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(MONTH FROM [[product_list_1]].[[date_action]]::timestamp)=@4@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(MONTH FROM product_list_1.date_action::timestamp) = \'4\')', $qs->countSql()); $qs = ProductList::objects()->filter(['date_action__month' => '3']); $this->assertEquals(0, $qs->count()); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(MONTH FROM [[product_list_1]].[[date_action]]::timestamp)=@3@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(MONTH FROM product_list_1.date_action::timestamp) = \'3\')', $qs->countSql()); } public function testDay() @@ -57,11 +60,11 @@ public function testDay() $qs = ProductList::objects()->filter(['date_action__day' => 29]); $this->assertEquals(1, $qs->count()); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(DAY FROM [[product_list_1]].[[date_action]]::timestamp)=@29@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(DAY FROM product_list_1.date_action::timestamp) = \'29\')', $qs->countSql()); $qs = ProductList::objects()->filter(['date_action__day' => '30']); $this->assertEquals(0, $qs->count()); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(DAY FROM [[product_list_1]].[[date_action]]::timestamp)=@30@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(DAY FROM product_list_1.date_action::timestamp) = \'30\')', $qs->countSql()); } public function testWeekDay() @@ -71,11 +74,11 @@ public function testWeekDay() $qs = ProductList::objects()->filter(['date_action__week_day' => 2]); $this->assertEquals(1, $qs->count()); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(DOW FROM [[product_list_1]].[[date_action]]::timestamp)=@2@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(DOW FROM product_list_1.date_action::timestamp) = \'2\')', $qs->countSql()); $qs = ProductList::objects()->filter(['date_action__week_day' => '3']); $this->assertEquals(0, $qs->count()); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(DOW FROM [[product_list_1]].[[date_action]]::timestamp)=@3@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(DOW FROM product_list_1.date_action::timestamp) = \'3\')', $qs->countSql()); } public function testHour() @@ -85,11 +88,11 @@ public function testHour() $qs = ProductList::objects()->filter(['date_action__hour' => 10]); $this->assertEquals(1, $qs->count()); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(HOUR FROM [[product_list_1]].[[date_action]]::timestamp)=@10@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(HOUR FROM product_list_1.date_action::timestamp) = \'10\')', $qs->countSql()); $qs = ProductList::objects()->filter(['date_action__hour' => '11']); $this->assertEquals(0, $qs->count()); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(HOUR FROM [[product_list_1]].[[date_action]]::timestamp)=@11@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(HOUR FROM product_list_1.date_action::timestamp) = \'11\')', $qs->countSql()); } public function testMinute() @@ -98,11 +101,11 @@ public function testMinute() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2012-03-29 10:34:45']))->save()); $qs = ProductList::objects()->filter(['date_action__minute' => 35]); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(MINUTE FROM [[product_list_1]].[[date_action]]::timestamp)=@35@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(MINUTE FROM product_list_1.date_action::timestamp) = \'35\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__minute' => '36']); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(MINUTE FROM [[product_list_1]].[[date_action]]::timestamp)=@36@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(MINUTE FROM product_list_1.date_action::timestamp) = \'36\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -112,40 +115,40 @@ public function testSecond() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2012-03-29 10:35:35']))->save()); $qs = ProductList::objects()->filter(['date_action__second' => 45]); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(SECOND FROM [[product_list_1]].[[date_action]]::timestamp)=@45@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(SECOND FROM product_list_1.date_action::timestamp) = \'45\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__second' => '46']); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(SECOND FROM [[product_list_1]].[[date_action]]::timestamp)=@46@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(SECOND FROM product_list_1.date_action::timestamp) = \'46\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } public function testRegex() { $this->assertTrue((new ProductList(['name' => 'foo', 'date_action' => '2014-04-29 10:35:45']))->save()); - $this->assertTrue((new ProductList(['name' => '@@@', 'date_action' => '2012-03-29 10:35:45']))->save()); + $this->assertTrue((new ProductList(['name' => '\'\'\'', 'date_action' => '2012-03-29 10:35:45']))->save()); $qs = ProductList::objects()->filter(['name__regex' => '^foo']); $this->assertEquals(1, $qs->count()); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[name]]~'^foo')", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.name ~ '^foo')", $qs->countSql()); $qs = ProductList::objects()->filter(['name__regex' => '^(b|c)']); $this->assertEquals(0, $qs->count()); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[name]]~'^(b|c)')", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.name ~ '^(b|c)')", $qs->countSql()); } public function testIregex() { $this->assertTrue((new ProductList(['name' => 'foo', 'date_action' => '2014-04-29 10:35:45']))->save()); - $this->assertTrue((new ProductList(['name' => '@@@', 'date_action' => '2012-03-29 10:35:45']))->save()); + $this->assertTrue((new ProductList(['name' => '\'\'\'', 'date_action' => '2012-03-29 10:35:45']))->save()); $qs = ProductList::objects()->filter(['name__iregex' => '^foo']); $this->assertEquals(1, $qs->count()); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[name]]~*'^foo')", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.name ~* '^foo')", $qs->countSql()); $qs = ProductList::objects()->filter(['name__iregex' => '^(b|c)']); $this->assertEquals(0, $qs->count()); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[name]]~*'^(b|c)')", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.name ~* '^(b|c)')", $qs->countSql()); } public function testContains() @@ -155,7 +158,7 @@ public function testContains() $model->save(); } $qs = Product::objects()->filter(['id__contains' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]]::text LIKE @%1%@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id::text LIKE \'%1%\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -166,7 +169,7 @@ public function testIcontains() $model->save(); } $qs = Product::objects()->filter(['id__icontains' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE (LOWER([[product_1]].[[id]]::text) LIKE @%1%@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (LOWER(product_1.id::text) LIKE \'%1%\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -177,7 +180,7 @@ public function testStartswith() $model->save(); } $qs = Product::objects()->filter(['id__startswith' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]]::text LIKE @1%@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id::text LIKE \'1%\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -188,7 +191,7 @@ public function testIstartswith() $model->save(); } $qs = Product::objects()->filter(['id__istartswith' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE (LOWER([[product_1]].[[id]]::text) LIKE @1%@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (LOWER(product_1.id::text) LIKE \'1%\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -199,7 +202,7 @@ public function testEndswith() $model->save(); } $qs = Product::objects()->filter(['id__endswith' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]]::text LIKE @%1@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id::text LIKE \'%1\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -210,7 +213,7 @@ public function testIendswith() $model->save(); } $qs = Product::objects()->filter(['id__iendswith' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE (LOWER([[product_1]].[[id]]::text) LIKE @%1@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (LOWER(product_1.id::text) LIKE \'%1\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); } } diff --git a/Tests/Databases/Sqlite/SqliteLookupRelationTest.php b/Tests/Databases/Sqlite/SqliteLookupRelationTest.php index 0257077a..afd7f1a9 100644 --- a/Tests/Databases/Sqlite/SqliteLookupRelationTest.php +++ b/Tests/Databases/Sqlite/SqliteLookupRelationTest.php @@ -10,9 +10,52 @@ namespace Mindy\Orm\Tests\Databases\Sqlite; +use Mindy\Orm\Tests\Models\Customer; +use Mindy\Orm\Tests\Models\Group; +use Mindy\Orm\Tests\Models\User; use Mindy\Orm\Tests\QueryBuilder\LookupRelationTest; class SqliteLookupRelationTest extends LookupRelationTest { public $driver = 'sqlite'; + + public function testManyLookup() + { + $user = new User(['username' => 'foo']); + $this->assertTrue($user->save()); + + $customer = new Customer(['address' => 'test', 'user' => $user]); + $this->assertTrue($customer->save()); + + $group = new Group(['name' => 'example']); + $this->assertTrue($group->save()); + $user->groups->link($group); + + $qs = Customer::objects()->filter(['user__groups__name' => 'example']); + $sql = $qs->allSql(); + $this->assertSame('SELECT customer_1.* FROM customer AS customer_1 LEFT JOIN users AS users_1 ON customer_1.user_id=users_1.id LEFT JOIN membership AS membership_1 ON membership_1.user_id=users_1.id LEFT JOIN "group" AS group_1 ON group_1.id=membership_1.group_id WHERE (group_1.name = \'example\')', $sql); + $this->assertEquals(1, $qs->count()); + $this->assertEquals(['id' => '1', 'user_id' => '1', 'address' => 'test'], $qs->asArray()->all()[0]); + } + + public function testManyLookupMultiple() + { + $user = new User(['username' => 'foo']); + $this->assertTrue($user->save()); + + $customer = new Customer(['address' => 'test', 'user' => $user]); + $this->assertTrue($customer->save()); + + $group = new Group(['name' => 'example']); + $this->assertTrue($group->save()); + $user->groups->link($group); + + $qs = User::objects()->filter([ + 'addresses__address__contains' => 'test', + 'groups__pk' => '1', + ]); + $sql = $qs->allSql(); + $this->assertSame('SELECT users_1.* FROM users AS users_1 LEFT JOIN customer AS customer_1 ON customer_1.user_id=users_1.id LEFT JOIN membership AS membership_1 ON membership_1.user_id=users_1.id LEFT JOIN "group" AS group_1 ON group_1.id=membership_1.group_id WHERE ((customer_1.address LIKE \'%test%\') AND (group_1.id = \'1\'))', $sql); + $this->assertEquals(1, $qs->count()); + } } diff --git a/Tests/Fields/ForeignFieldTest.php b/Tests/Fields/ForeignFieldTest.php index e4b711c9..a6617650 100644 --- a/Tests/Fields/ForeignFieldTest.php +++ b/Tests/Fields/ForeignFieldTest.php @@ -13,6 +13,7 @@ use Mindy\Orm\Tests\Models\Product; use Mindy\Orm\Tests\OrmDatabaseTestCase; use Mindy\QueryBuilder\QueryBuilder; +use Mindy\QueryBuilder\Utils\TableNameResolver; class ForeignFieldTest extends OrmDatabaseTestCase { @@ -25,8 +26,7 @@ public function testForeignKey() { $c = $this->getConnection(); $schemaManager = $c->getSchemaManager(); - $adapter = QueryBuilder::getInstance($c)->getAdapter(); - $tableName = $adapter->getRawTableName(Product::tableName()); + $tableName = TableNameResolver::getTableName(Product::tableName()); $columns = $schemaManager->listTableColumns($tableName); $this->assertArrayHasKey('id', $columns); $this->assertArrayHasKey('category_id', $columns); diff --git a/Tests/Fields/HasManyFieldTest.php b/Tests/Fields/HasManyFieldTest.php index f25a9814..f78238bf 100644 --- a/Tests/Fields/HasManyFieldTest.php +++ b/Tests/Fields/HasManyFieldTest.php @@ -93,7 +93,7 @@ public function testMultiple() $qs = Cup::objects()->filter(['designs__name' => 'Dragon', 'colors__name' => 'red']); $sql = $qs->allSql(); - $this->assertSql("SELECT [[cup_1]].* FROM [[cup]] AS [[cup_1]] LEFT JOIN [[design]] AS [[design_1]] ON [[design_1]].[[cup_id]]=[[cup_1]].[[id]] LEFT JOIN [[color]] AS [[color_1]] ON [[color_1]].[[cup_id]]=[[cup_1]].[[id]] WHERE (([[design_1]].[[name]]='Dragon') AND ([[color_1]].[[name]]='red'))", $sql); + $this->assertSql("SELECT [[cup_1]].* FROM [[cup]] AS [[cup_1]] LEFT JOIN [[design]] AS [[design_1]] ON [[design_1]].[[cup_id]]=[[cup_1]].[[id]] LEFT JOIN [[color]] AS [[color_1]] ON [[color_1]].[[cup_id]]=[[cup_1]].[[id]] WHERE (([[design_1]].[[name]] = 'Dragon') AND ([[color_1]].[[name]] = 'red'))", $sql); $this->assertEquals(1, $qs->count()); } } diff --git a/Tests/Fields/ManyToManyFieldTest.php b/Tests/Fields/ManyToManyFieldTest.php index c3fddf04..fbbeb226 100644 --- a/Tests/Fields/ManyToManyFieldTest.php +++ b/Tests/Fields/ManyToManyFieldTest.php @@ -22,6 +22,8 @@ use Mindy\Orm\Tests\Models\Worker; use Mindy\Orm\Tests\OrmDatabaseTestCase; use Mindy\QueryBuilder\QueryBuilder; +use Mindy\QueryBuilder\QueryBuilderFactory; +use Mindy\QueryBuilder\Utils\TableNameResolver; abstract class ManyToManyFieldTest extends OrmDatabaseTestCase { @@ -274,7 +276,7 @@ public function testExtraLinkRecords() $this->assertEquals(1, Product::objects()->count()); $this->assertEquals(2, ProductList::objects()->count()); $tableName = $product->getField('lists')->getTableName(); - $tableName = QueryBuilder::getInstance($this->getConnection())->getAdapter()->getRawTableName($tableName); + $tableName = TableNameResolver::getTableName($tableName); $cmd = $this->getConnection()->query('SELECT * FROM '.$tableName); $all = $cmd->fetchAll(); $this->assertEquals([], $all); @@ -376,7 +378,7 @@ public function testViaOrder() $this->assertSql('SELECT [[worker_1]].* FROM [[worker]] AS [[worker_1]] LEFT JOIN [[project_membership]] AS [[project_membership_1]] ON [[project_membership_1]].[[worker_id]]=[[worker_1]].[[id]] LEFT JOIN [[project]] AS [[project_1]] ON [[project_1]].[[id]]=[[project_membership_1]].[[project_id]] -WHERE ([[project_1]].[[id]] IN (@1@)) +WHERE ([[project_1]].[[id]] IN (\'1\')) ORDER BY [[project_membership_1]].[[position]] ASC', $qs->allSql()); $this->assertEquals([ ['id' => '1', 'name' => 'Mark'], @@ -406,11 +408,14 @@ public function testViaOrder() ['id' => '1', 'name' => 'Mark'], ], Worker::objects()->filter(['projects__through__curator' => $secondWorker])->asArray()->all()); - $this->assertSql('SELECT [[worker_1]].* FROM [[worker]] AS [[worker_1]] LEFT JOIN [[project_membership]] AS [[project_membership_1]] ON [[project_membership_1]].[[worker_id]]=[[worker_1]].[[id]] LEFT JOIN [[project]] AS [[project_1]] ON [[project_1]].[[id]]=[[project_membership_1]].[[project_id]] WHERE ([[project_membership_1]].[[curator_id]]=@2@)', + $this->assertSame( + 'SELECT worker_1.* FROM worker AS worker_1 LEFT JOIN project_membership AS project_membership_1 ON project_membership_1.worker_id=worker_1.id LEFT JOIN project AS project_1 ON project_1.id=project_membership_1.project_id WHERE (project_membership_1.curator_id = \'2\')', Worker::objects()->filter(['projects__through__curator' => $secondWorker])->allSql()); - $this->assertSql('SELECT [[worker_1]].* FROM [[worker]] AS [[worker_1]] LEFT JOIN [[project_membership]] AS [[project_membership_1]] ON [[project_membership_1]].[[worker_id]]=[[worker_1]].[[id]] LEFT JOIN [[project]] AS [[project_1]] ON [[project_1]].[[id]]=[[project_membership_1]].[[project_id]] ORDER BY [[project_membership_1]].[[position]] ASC', + $this->assertSame( + 'SELECT worker_1.* FROM worker AS worker_1 LEFT JOIN project_membership AS project_membership_1 ON project_membership_1.worker_id=worker_1.id LEFT JOIN project AS project_1 ON project_1.id=project_membership_1.project_id ORDER BY project_membership_1.position ASC', Worker::objects()->order(['projects__through__position'])->asArray()->allSql()); - $this->assertSql('SELECT [[worker_1]].* FROM [[worker]] AS [[worker_1]] LEFT JOIN [[project_membership]] AS [[project_membership_1]] ON [[project_membership_1]].[[worker_id]]=[[worker_1]].[[id]] LEFT JOIN [[project]] AS [[project_1]] ON [[project_1]].[[id]]=[[project_membership_1]].[[project_id]] WHERE ([[project_1]].[[id]] IN (@1@, @2@)) ORDER BY [[project_membership_1]].[[position]] DESC', + $this->assertSame( + 'SELECT worker_1.* FROM worker AS worker_1 LEFT JOIN project_membership AS project_membership_1 ON project_membership_1.worker_id=worker_1.id LEFT JOIN project AS project_1 ON project_1.id=project_membership_1.project_id WHERE (project_1.id IN (\'1\', \'2\')) ORDER BY project_membership_1.position DESC', Worker::objects()->filter(['projects__id__in' => [$firstProject->id, $secondProject->id]])->order(['-projects__through__position'])->allSql()); } diff --git a/Tests/QueryBuilder/LookupRelationTest.php b/Tests/QueryBuilder/LookupRelationTest.php index 2c4cb5f6..48520f59 100644 --- a/Tests/QueryBuilder/LookupRelationTest.php +++ b/Tests/QueryBuilder/LookupRelationTest.php @@ -33,10 +33,10 @@ public function testSimpleExact() $sql = Customer::objects()->filter(['user__username' => 'foo'])->allSql(); $this->assertSql( - 'SELECT [[customer_1]].* -FROM [[customer]] AS [[customer_1]] -LEFT JOIN [[users]] AS [[users_1]] ON [[customer_1]].[[user_id]]=[[users_1]].[[id]] -WHERE ([[users_1]].[[username]]=@foo@)', $sql); + 'SELECT customer_1.* +FROM customer AS customer_1 +LEFT JOIN users AS users_1 ON customer_1.user_id=users_1.id +WHERE (users_1.username = \'foo\')', $sql); } public function testSimpleLookup() @@ -49,10 +49,10 @@ public function testSimpleLookup() $sql = Customer::objects()->filter(['user__username__startswith' => 't'])->allSql(); $this->assertSql( - 'SELECT [[customer_1]].* -FROM [[customer]] AS [[customer_1]] -LEFT JOIN [[users]] AS [[users_1]] ON [[customer_1]].[[user_id]]=[[users_1]].[[id]] -WHERE ([[users_1]].[[username]] LIKE @t%@)', $sql); + 'SELECT customer_1.* +FROM customer AS customer_1 +LEFT JOIN users AS users_1 ON customer_1.user_id=users_1.id +WHERE (users_1.username LIKE \'t%\')', $sql); } public function testManyLookup() @@ -69,13 +69,7 @@ public function testManyLookup() $qs = Customer::objects()->filter(['user__groups__name' => 'example']); $sql = $qs->allSql(); - $this->assertSql( - 'SELECT [[customer_1]].* -FROM [[customer]] AS [[customer_1]] -LEFT JOIN [[users]] AS [[users_1]] ON [[customer_1]].[[user_id]]=[[users_1]].[[id]] -LEFT JOIN [[membership]] AS [[membership_1]] ON [[membership_1]].[[user_id]]=[[users_1]].[[id]] -LEFT JOIN [[group]] AS [[group_1]] ON [[group_1]].[[id]]=[[membership_1]].[[group_id]] -WHERE ([[group_1]].[[name]]=@example@)', $sql); + $this->assertSame('SELECT customer_1.* FROM customer AS customer_1 LEFT JOIN users AS users_1 ON customer_1.user_id=users_1.id LEFT JOIN membership AS membership_1 ON membership_1.user_id=users_1.id LEFT JOIN `group` AS group_1 ON group_1.id=membership_1.group_id WHERE (group_1.name = \'example\')', $sql); $this->assertEquals(1, $qs->count()); $this->assertEquals(['id' => '1', 'user_id' => '1', 'address' => 'test'], $qs->asArray()->all()[0]); } @@ -95,10 +89,10 @@ public function testManyLookupAnother() $qs = User::objects()->filter(['addresses__address__contains' => 'test']); $sql = $qs->allSql(); $this->assertSql( - 'SELECT [[users_1]].* -FROM [[users]] AS [[users_1]] -LEFT JOIN [[customer]] AS [[customer_1]] ON [[customer_1]].[[user_id]]=[[users_1]].[[id]] -WHERE ([[customer_1]].[[address]] LIKE @%test%@)', $sql); + 'SELECT users_1.* +FROM users AS users_1 +LEFT JOIN customer AS customer_1 ON customer_1.user_id=users_1.id +WHERE (customer_1.address LIKE \'%test%\')', $sql); $this->assertEquals(1, $qs->count()); } @@ -120,11 +114,11 @@ public function testManyLookupMultiple() ]); $sql = $qs->allSql(); $this->assertSql( - 'SELECT [[users_1]].* FROM [[users]] AS [[users_1]] -LEFT JOIN [[customer]] AS [[customer_1]] ON [[customer_1]].[[user_id]]=[[users_1]].[[id]] -LEFT JOIN [[membership]] AS [[membership_1]] ON [[membership_1]].[[user_id]]=[[users_1]].[[id]] -LEFT JOIN [[group]] AS [[group_1]] ON [[group_1]].[[id]]=[[membership_1]].[[group_id]] -WHERE (([[customer_1]].[[address]] LIKE @%test%@) AND ([[group_1]].[[id]]=@1@))', $sql); + 'SELECT users_1.* FROM users AS users_1 +LEFT JOIN customer AS customer_1 ON customer_1.user_id=users_1.id +LEFT JOIN membership AS membership_1 ON membership_1.user_id=users_1.id +LEFT JOIN `group` AS group_1 ON group_1.id=membership_1.group_id +WHERE ((customer_1.address LIKE \'%test%\') AND (group_1.id = \'1\'))', $sql); $this->assertEquals(1, $qs->count()); } diff --git a/Tests/QueryBuilder/LookupTest.php b/Tests/QueryBuilder/LookupTest.php index ed6cb2c3..76745f4b 100644 --- a/Tests/QueryBuilder/LookupTest.php +++ b/Tests/QueryBuilder/LookupTest.php @@ -39,7 +39,7 @@ public function testExact() $this->assertTrue((new Product())->save()); $this->assertEquals(1, Product::objects()->count()); $qs = Product::objects()->filter(['id' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]]=1)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id = 1)', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -47,7 +47,7 @@ public function testIsNull() { $qs = Product::objects()->filter(['id__isnull' => true]); $this->assertEquals(0, $qs->count()); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]] IS NULL)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id IS NULL)', $qs->countSql()); } public function testIn() @@ -57,7 +57,7 @@ public function testIn() $model->save(); } $qs = Product::objects()->filter(['id__in' => [1, 2, 3, 4, 5]]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]] IN (1, 2, 3, 4, 5))', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id IN (1, 2, 3, 4, 5))', $qs->countSql()); $this->assertEquals(5, $qs->count()); } @@ -68,7 +68,7 @@ public function testGte() $model->save(); } $qs = Product::objects()->filter(['id__gte' => 2]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]]>=2)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id >= 2)', $qs->countSql()); $this->assertEquals(4, $qs->count()); } @@ -79,7 +79,7 @@ public function testGt() $model->save(); } $qs = Product::objects()->filter(['id__gt' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]]>1)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id > 1)', $qs->countSql()); $this->assertEquals(4, $qs->count()); } @@ -90,7 +90,7 @@ public function testLte() $model->save(); } $qs = Product::objects()->filter(['id__lte' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]]<=1)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id <= 1)', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -101,7 +101,7 @@ public function testLt() $model->save(); } $qs = Product::objects()->filter(['id__lt' => 2]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]]<2)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id < 2)', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -112,7 +112,7 @@ public function testContains() $model->save(); } $qs = Product::objects()->filter(['id__contains' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]] LIKE @%1%@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id LIKE \'%1%\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -123,7 +123,7 @@ public function testIcontains() $model->save(); } $qs = Product::objects()->filter(['id__icontains' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE (LOWER([[product_1]].[[id]]) LIKE @%1%@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (LOWER(product_1.id) LIKE \'%1%\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -134,7 +134,7 @@ public function testStartswith() $model->save(); } $qs = Product::objects()->filter(['id__startswith' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]] LIKE @1%@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id LIKE \'1%\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -145,7 +145,7 @@ public function testIstartswith() $model->save(); } $qs = Product::objects()->filter(['id__istartswith' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE (LOWER([[product_1]].[[id]]) LIKE @1%@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (LOWER(product_1.id) LIKE \'1%\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -156,7 +156,7 @@ public function testEndswith() $model->save(); } $qs = Product::objects()->filter(['id__endswith' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ([[product_1]].[[id]] LIKE @%1@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (product_1.id LIKE \'%1\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -167,7 +167,7 @@ public function testIendswith() $model->save(); } $qs = Product::objects()->filter(['id__iendswith' => 1]); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE (LOWER([[product_1]].[[id]]) LIKE @%1@)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE (LOWER(product_1.id) LIKE \'%1\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); } @@ -177,11 +177,11 @@ public function testYear() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-29 10:35:45']))->save()); $qs = ProductList::objects()->filter(['date_action__year' => 2014]); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%Y', [[product_list_1]].[[date_action]])=@2014@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%Y\', product_list_1.date_action) = \'2014\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__year' => '2012']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%Y', [[product_list_1]].[[date_action]])=@2012@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%Y\', product_list_1.date_action) = \'2012\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -191,11 +191,11 @@ public function testMonth() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-01-29 10:35:45']))->save()); $qs = ProductList::objects()->filter(['date_action__month' => 4]); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%m', [[product_list_1]].[[date_action]])=@04@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%m\', product_list_1.date_action) = \'04\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__month' => '3']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%m', [[product_list_1]].[[date_action]])=@03@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%m\', product_list_1.date_action) = \'03\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -205,11 +205,11 @@ public function testDay() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-02-28 10:35:45']))->save()); $qs = ProductList::objects()->filter(['date_action__day' => 29]); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%d', [[product_list_1]].[[date_action]])=@29@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%d\', product_list_1.date_action) = \'29\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__day' => '30']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%d', [[product_list_1]].[[date_action]])=@30@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%d\', product_list_1.date_action) = \'30\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -219,15 +219,15 @@ public function testWeekDay() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-02-28 10:35:45']))->save()); $qs = ProductList::objects()->filter(['date_action__week_day' => 2]); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%w', [[product_list_1]].[[date_action]])=@2@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%w\', product_list_1.date_action) = \'2\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__week_day' => '5']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%w', [[product_list_1]].[[date_action]])=@5@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%w\', product_list_1.date_action) = \'5\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); $qs = ProductList::objects()->filter(['date_action__week_day' => '7']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%w', [[product_list_1]].[[date_action]])=@0@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%w\', product_list_1.date_action) = \'0\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -238,11 +238,11 @@ public function testHour() $qs = ProductList::objects()->filter(['date_action__hour' => 10]); $this->assertEquals(1, $qs->count()); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%H', [[product_list_1]].[[date_action]])=@10@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%H\', product_list_1.date_action) = \'10\')', $qs->countSql()); $qs = ProductList::objects()->filter(['date_action__hour' => '11']); $this->assertEquals(0, $qs->count()); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%H', [[product_list_1]].[[date_action]])=@11@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%H\', product_list_1.date_action) = \'11\')', $qs->countSql()); } public function testMinute() @@ -251,11 +251,11 @@ public function testMinute() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-02-28 10:37:45']))->save()); $qs = ProductList::objects()->filter(['date_action__minute' => 35]); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%M', [[product_list_1]].[[date_action]])=@35@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%M\', product_list_1.date_action) = \'35\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__minute' => '36']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%M', [[product_list_1]].[[date_action]])=@36@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%M\', product_list_1.date_action) = \'36\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -265,11 +265,11 @@ public function testSecond() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-02-28 10:37:43']))->save()); $qs = ProductList::objects()->filter(['date_action__second' => 45]); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%S', [[product_list_1]].[[date_action]])=@45@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%S\', product_list_1.date_action) = \'45\')', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['date_action__second' => '46']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (strftime('%S', [[product_list_1]].[[date_action]])=@46@)", $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (strftime(\'%S\', product_list_1.date_action) = \'46\')', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -279,11 +279,11 @@ public function testRange() $this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-02-28 10:37:43']))->save()); $qs = ProductList::objects()->filter(['id__range' => [0, 1]]); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[id]] BETWEEN 0 AND 1)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.id BETWEEN 0 AND 1)', $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['id__range' => [10, 20]]); - $this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[id]] BETWEEN 10 AND 20)', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.id BETWEEN 10 AND 20)', $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -293,11 +293,11 @@ public function testRegex() $this->assertTrue((new ProductList(['name' => '123', 'date_action' => '2013-02-28 10:37:43']))->save()); $qs = ProductList::objects()->filter(['name__regex' => 'foo']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[name]] REGEXP '/foo/')", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.name REGEXP '/foo/')", $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['name__regex' => 'foo123']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[name]] REGEXP '/foo123/')", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.name REGEXP '/foo123/')", $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -307,11 +307,11 @@ public function testIregex() $this->assertTrue((new ProductList(['name' => '123', 'date_action' => '2013-02-28 10:37:43']))->save()); $qs = ProductList::objects()->filter(['name__iregex' => 'foo']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[name]] REGEXP '/foo/i')", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.name REGEXP '/foo/i')", $qs->countSql()); $this->assertEquals(1, $qs->count()); $qs = ProductList::objects()->filter(['name__iregex' => 'foo123']); - $this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[name]] REGEXP '/foo123/i')", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.name REGEXP '/foo123/i')", $qs->countSql()); $this->assertEquals(0, $qs->count()); } @@ -320,20 +320,20 @@ public function testSql() $qs = Product::objects() ->filter(['name' => 'vasya', 'id__lte' => 7]) ->filter(['name' => 'petya', 'id__gte' => 3]); - $this->assertSql("SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ((([[product_1]].[[name]]='vasya') AND ([[product_1]].[[id]]<=7))) AND ((([[product_1]].[[name]]='petya') AND ([[product_1]].[[id]]>=3)))", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product AS product_1 WHERE (((product_1.name = 'vasya') AND (product_1.id <= 7))) AND (((product_1.name = 'petya') AND (product_1.id >= 3)))", $qs->countSql()); $qs = Product::objects() ->filter(['name' => 'vasya', 'id__lte' => 2]) ->orFilter(['name' => 'petya', 'id__gte' => 4]); - $this->assertSql("SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE ((([[product_1]].[[name]]='vasya') AND ([[product_1]].[[id]]<=2))) OR ((([[product_1]].[[name]]='petya') AND ([[product_1]].[[id]]>=4)))", $qs->countSql()); + $this->assertSame("SELECT COUNT(*) FROM product AS product_1 WHERE (((product_1.name = 'vasya') AND (product_1.id <= 2))) OR (((product_1.name = 'petya') AND (product_1.id >= 4)))", $qs->countSql()); } public function testAllSql() { $qs = Product::objects()->filter(['id' => 1]); - $this->assertSql('SELECT [[product_1]].* FROM [[product]] AS [[product_1]] WHERE (([[product_1]].[[id]]=1))', $qs->getSql()); - $this->assertSql('SELECT [[product_1]].* FROM [[product]] AS [[product_1]] WHERE (([[product_1]].[[id]]=1))', $qs->allSql()); - $this->assertSql('SELECT COUNT(*) FROM [[product]] AS [[product_1]] WHERE (([[product_1]].[[id]]=1))', $qs->countSql()); + $this->assertSame('SELECT product_1.* FROM product AS product_1 WHERE ((product_1.id = 1))', $qs->getSql()); + $this->assertSame('SELECT product_1.* FROM product AS product_1 WHERE ((product_1.id = 1))', $qs->allSql()); + $this->assertSame('SELECT COUNT(*) FROM product AS product_1 WHERE ((product_1.id = 1))', $qs->countSql()); } public function testQ() @@ -342,8 +342,8 @@ public function testQ() ['name' => 'vasya', 'id__lte' => 7], ['name' => 'petya', 'id__gte' => 4], ])); - $this->assertSql( - "WHERE (([[product_1]].[[name]]='vasya' OR [[product_1]].[[id]]<=7) OR ([[product_1]].[[name]]='petya' OR [[product_1]].[[id]]>=4))", + $this->assertSame( + " WHERE ((product_1.name = 'vasya' OR product_1.id <= 7) OR (product_1.name = 'petya' OR product_1.id >= 4))", $qs->getQueryBuilder()->buildWhere() ); @@ -354,8 +354,8 @@ public function testQ() ]), 'price__gte' => 200, ]); - $this->assertSql( - "WHERE ((([[product_1]].[[name]]='vasya' OR [[product_1]].[[id]]<=7) OR ([[product_1]].[[name]]='petya' OR [[product_1]].[[id]]>=4)) AND ([[product_1]].[[price]]>=200))", + $this->assertSame( + " WHERE (((product_1.name = 'vasya' OR product_1.id <= 7) OR (product_1.name = 'petya' OR product_1.id >= 4)) AND (product_1.price >= 200))", $qs->getQueryBuilder()->buildWhere() ); @@ -367,8 +367,8 @@ public function testQ() 'price__gte' => 200, ]); - $this->assertSql( - "WHERE ((([[product_1]].[[name]]='vasya' AND [[product_1]].[[id]]<=7) AND ([[product_1]].[[name]]='petya' AND [[product_1]].[[id]]>=4)) AND ([[product_1]].[[price]]>=200))", + $this->assertSame( + " WHERE (((product_1.name = 'vasya' AND product_1.id <= 7) AND (product_1.name = 'petya' AND product_1.id >= 4)) AND (product_1.price >= 200))", $qs->getQueryBuilder()->buildWhere() ); } diff --git a/Tests/QueryBuilder/QuerySetTest.php b/Tests/QueryBuilder/QuerySetTest.php index 1ebc4246..3f3341fa 100644 --- a/Tests/QueryBuilder/QuerySetTest.php +++ b/Tests/QueryBuilder/QuerySetTest.php @@ -115,7 +115,7 @@ public function testOrExclude() $qs = Hits::objects()->orExclude(['id' => 2])->exclude(['id' => 1]); $count = $qs->count(); $sql = $qs->countSql(); - $this->assertSql('SELECT COUNT(*) FROM [[hits]] AS [[hits_1]] WHERE ((NOT ([[hits_1]].[[id]]=1))) OR ((NOT ([[hits_1]].[[id]]=2)))', $sql); + $this->assertSame('SELECT COUNT(*) FROM hits AS hits_1 WHERE ((NOT (hits_1.id = 1))) OR ((NOT (hits_1.id = 2)))', $sql); $this->assertEquals(3, $count); $count = Hits::objects()->exclude(['id' => 1])->orExclude(['id' => 2])->count(); diff --git a/Tests/QueryBuilder/QueryTest.php b/Tests/QueryBuilder/QueryTest.php index 5af74b0d..33b4de66 100644 --- a/Tests/QueryBuilder/QueryTest.php +++ b/Tests/QueryBuilder/QueryTest.php @@ -32,7 +32,7 @@ public function testGet() $this->assertEquals('foo', $user->username); $sql = User::objects()->asArray()->getSql(['pk' => 1]); - $this->assertSql('SELECT [[users_1]].* FROM [[users]] AS [[users_1]] WHERE ([[users_1]].[[id]]=1)', $sql); + $this->assertSame('SELECT users_1.* FROM users AS users_1 WHERE (users_1.id = 1)', $sql); $this->assertEquals([ 'id' => 1, 'username' => 'foo', @@ -58,7 +58,7 @@ public function testExclude() $this->assertTrue((new User(['username' => 'bar']))->save()); $qs = User::objects()->filter(['username' => 'foo'])->exclude(['username' => 'bar']); $this->assertEquals(1, $qs->count()); - $this->assertSql('SELECT COUNT(*) FROM [[users]] AS [[users_1]] WHERE (([[users_1]].[[username]]=@foo@)) AND ((NOT ([[users_1]].[[username]]=@bar@)))', $qs->countSql()); + $this->assertSame('SELECT COUNT(*) FROM users AS users_1 WHERE ((users_1.username = \'foo\')) AND ((NOT (users_1.username = \'bar\')))', $qs->countSql()); } public function testOrExclude() @@ -68,8 +68,8 @@ public function testOrExclude() $qs = User::objects(); $this->assertEquals(2, $qs->count()); $qs->exclude(['username' => 'foo'])->orExclude(['username' => 'bar']); - $this->assertSql( - 'SELECT COUNT(*) FROM [[users]] AS [[users_1]] WHERE ((NOT ([[users_1]].[[username]]=@foo@))) OR ((NOT ([[users_1]].[[username]]=@bar@)))', + $this->assertSame( + 'SELECT COUNT(*) FROM users AS users_1 WHERE ((NOT (users_1.username = \'foo\'))) OR ((NOT (users_1.username = \'bar\')))', $qs->countSql() ); } diff --git a/Tests/QueryBuilder/SubqueriesTest.php b/Tests/QueryBuilder/SubqueriesTest.php index 580064ba..2938c6e7 100644 --- a/Tests/QueryBuilder/SubqueriesTest.php +++ b/Tests/QueryBuilder/SubqueriesTest.php @@ -54,13 +54,13 @@ public function testSubqueryIn() $qs = User::objects()->filter([ 'groups__pk__in' => Group::objects()->filter(['id' => 2])->select('id'), ]); - $this->assertSql('SELECT [[users_1]].* FROM [[users]] AS [[users_1]] LEFT JOIN [[membership]] AS [[membership_1]] ON [[membership_1]].[[user_id]]=[[users_1]].[[id]] LEFT JOIN [[group]] AS [[group_1]] ON [[group_1]].[[id]]=[[membership_1]].[[group_id]] WHERE ([[group_1]].[[id]] IN (SELECT [[group_1]].[[id]] FROM [[group]] AS [[group_1]] WHERE ([[group_1]].[[id]]=2)))', $qs->allSql()); + $this->assertSql('SELECT [[users_1]].* FROM [[users]] AS [[users_1]] LEFT JOIN [[membership]] AS [[membership_1]] ON [[membership_1]].[[user_id]]=[[users_1]].[[id]] LEFT JOIN [[group]] AS [[group_1]] ON [[group_1]].[[id]]=[[membership_1]].[[group_id]] WHERE ([[group_1]].[[id]] IN (SELECT [[group_1]].[[id]] FROM [[group]] AS [[group_1]] WHERE ([[group_1]].[[id]] = 2)))', $qs->allSql()); $this->assertEquals([], $qs->asArray()->all()); $qs = User::objects()->filter([ 'groups__pk__in' => Group::objects()->filter(['id' => 1])->select('id'), ])->order(['id']); - $this->assertSql('SELECT [[users_1]].* FROM [[users]] AS [[users_1]] LEFT JOIN [[membership]] AS [[membership_1]] ON [[membership_1]].[[user_id]]=[[users_1]].[[id]] LEFT JOIN [[group]] AS [[group_1]] ON [[group_1]].[[id]]=[[membership_1]].[[group_id]] WHERE ([[group_1]].[[id]] IN (SELECT [[group_1]].[[id]] FROM [[group]] AS [[group_1]] WHERE ([[group_1]].[[id]]=1))) ORDER BY [[users_1]].[[id]] ASC', $qs->allSql()); + $this->assertSql('SELECT [[users_1]].* FROM [[users]] AS [[users_1]] LEFT JOIN [[membership]] AS [[membership_1]] ON [[membership_1]].[[user_id]]=[[users_1]].[[id]] LEFT JOIN [[group]] AS [[group_1]] ON [[group_1]].[[id]]=[[membership_1]].[[group_id]] WHERE ([[group_1]].[[id]] IN (SELECT [[group_1]].[[id]] FROM [[group]] AS [[group_1]] WHERE ([[group_1]].[[id]] = 1))) ORDER BY [[users_1]].[[id]] ASC', $qs->allSql()); $users = $qs->asArray()->all(); $this->assertEquals([ ['id' => 1, 'username' => 'foo', 'password' => ''], diff --git a/composer.json b/composer.json index be2af3fb..5ab41500 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "php": ">=7.0", "doctrine/common": "~2.0|~3.0", "doctrine/dbal": "~2.0|~3.0", - "mindy/query_builder": "dev-master", + "mindy/query_builder": ">=4.0.4", "symfony/event-dispatcher": "~3.0|~4.0", "symfony/validator": "~3.0|~4.0" }, diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 9d9f033c..172f7e56 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -2,7 +2,6 @@