diff --git a/composer.json b/composer.json index 2c00492dd..89d62f2f6 100644 --- a/composer.json +++ b/composer.json @@ -15,6 +15,7 @@ "require": { "php": ">=5.3.2", "ext-pdo": "*", + "doctrine/collections": "~1.1", "doctrine/dbal": ">=2.4-dev,<2.5-dev", "symfony/console": "2.*" }, diff --git a/composer.lock b/composer.lock index 6b3fcb3d0..23205bf9a 100644 --- a/composer.lock +++ b/composer.lock @@ -1,5 +1,5 @@ { - "hash": "eff8840dfb1a83e6e1aef32b8031ac7c", + "hash": "acae8c9f654bd03696631d5eac8d16ad", "packages": [ { "name": "doctrine/annotations", @@ -22,7 +22,6 @@ "require-dev": { "doctrine/cache": "1.*" }, - "time": "2013-01-12 19:23:32", "type": "library", "autoload": { "psr-0": { @@ -65,7 +64,8 @@ "annotations", "docblock", "parser" - ] + ], + "time": "2013-01-12 19:23:32" }, { "name": "doctrine/cache", @@ -84,7 +84,6 @@ "require": { "php": ">=5.3.2" }, - "time": "2013-01-10 22:43:46", "type": "library", "autoload": { "psr-0": { @@ -126,27 +125,32 @@ "keywords": [ "cache", "caching" - ] + ], + "time": "2013-01-10 22:43:46" }, { "name": "doctrine/collections", - "version": "v1.0", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "v1.0" + "reference": "560f29c39cfcfbcd210e5d549d993a39d898b04b" }, "dist": { "type": "zip", - "url": "https://github.com/doctrine/collections/archive/v1.0.zip", - "reference": "v1.0", + "url": "https://api.github.com/repos/doctrine/collections/zipball/560f29c39cfcfbcd210e5d549d993a39d898b04b", + "reference": "560f29c39cfcfbcd210e5d549d993a39d898b04b", "shasum": "" }, "require": { "php": ">=5.3.2" }, - "time": "2013-01-12 16:36:50", "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, "autoload": { "psr-0": { "Doctrine\\Common\\Collections\\": "lib/" @@ -188,7 +192,8 @@ "array", "collections", "iterator" - ] + ], + "time": "2013-03-07 12:15:54" }, { "name": "doctrine/common", @@ -212,7 +217,6 @@ "doctrine/lexer": "1.*", "php": ">=5.3.2" }, - "time": "2013-01-29 12:48:56", "type": "library", "extra": { "branch-alias": { @@ -262,7 +266,8 @@ "eventmanager", "persistence", "spl" - ] + ], + "time": "2013-01-29 12:48:56" }, { "name": "doctrine/dbal", @@ -288,7 +293,6 @@ "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." }, - "time": "2013-02-09 23:28:29", "type": "library", "extra": { "branch-alias": { @@ -331,7 +335,8 @@ "dbal", "persistence", "queryobject" - ] + ], + "time": "2013-02-09 23:28:29" }, { "name": "doctrine/inflector", @@ -350,7 +355,6 @@ "require": { "php": ">=5.3.2" }, - "time": "2013-01-10 21:49:15", "type": "library", "autoload": { "psr-0": { @@ -394,7 +398,8 @@ "pluarlize", "singuarlize", "string" - ] + ], + "time": "2013-01-10 21:49:15" }, { "name": "doctrine/lexer", @@ -413,7 +418,6 @@ "require": { "php": ">=5.3.2" }, - "time": "2013-01-12 18:59:04", "type": "library", "autoload": { "psr-0": { @@ -446,7 +450,8 @@ "keywords": [ "lexer", "parser" - ] + ], + "time": "2013-01-12 18:59:04" }, { "name": "symfony/console", @@ -466,7 +471,6 @@ "require": { "php": ">=5.3.3" }, - "time": "2013-01-31 21:39:01", "type": "library", "extra": { "branch-alias": { @@ -493,15 +497,25 @@ } ], "description": "Symfony Console Component", - "homepage": "http://symfony.com" + "homepage": "http://symfony.com", + "time": "2013-01-31 21:39:01" } ], - "packages-dev": null, + "packages-dev": [ + + ], "aliases": [ ], "minimum-stability": "dev", "stability-flags": [ + ], + "platform": { + "php": ">=5.3.2", + "ext-pdo": "*" + }, + "platform-dev": [ + ] } diff --git a/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php b/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php index d5543dad4..649ad2e8e 100644 --- a/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php +++ b/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php @@ -84,15 +84,16 @@ class BasicEntityPersister * @var array */ static private $comparisonMap = array( - Comparison::EQ => '= %s', - Comparison::IS => 'IS %s', - Comparison::NEQ => '!= %s', - Comparison::GT => '> %s', - Comparison::GTE => '>= %s', - Comparison::LT => '< %s', - Comparison::LTE => '<= %s', - Comparison::IN => 'IN (%s)', - Comparison::NIN => 'NOT IN (%s)', + Comparison::EQ => '= %s', + Comparison::IS => 'IS %s', + Comparison::NEQ => '!= %s', + Comparison::GT => '> %s', + Comparison::GTE => '>= %s', + Comparison::LT => '< %s', + Comparison::LTE => '<= %s', + Comparison::IN => 'IN (%s)', + Comparison::NIN => 'NOT IN (%s)', + Comparison::CONTAINS => 'LIKE %s', ); /** diff --git a/lib/Doctrine/ORM/Persisters/SqlValueVisitor.php b/lib/Doctrine/ORM/Persisters/SqlValueVisitor.php index 1d805c041..79e5150e5 100644 --- a/lib/Doctrine/ORM/Persisters/SqlValueVisitor.php +++ b/lib/Doctrine/ORM/Persisters/SqlValueVisitor.php @@ -50,7 +50,7 @@ class SqlValueVisitor extends ExpressionVisitor */ public function walkComparison(Comparison $comparison) { - $value = $comparison->getValue()->getValue(); + $value = $this->getValueFromComparison($comparison); $field = $comparison->getField(); $this->values[] = $value; @@ -92,4 +92,20 @@ class SqlValueVisitor extends ExpressionVisitor { return array($this->values, $this->types); } + + /** + * Returns the value from a Comparison. In case of a CONTAINS comparison, + * the value is wrapped in %-signs, because it will be used in a LIKE clause. + * + * @param \Doctrine\Common\Collections\Expr\Comparison $comparison + * @return mixed + */ + protected function getValueFromComparison(Comparison $comparison) + { + $value = $comparison->getValue()->getValue(); + + return $comparison->getOperator() == Comparison::CONTAINS + ? "%{$value}%" + : $value; + } } diff --git a/tests/Doctrine/Tests/ORM/Functional/EntityRepositoryTest.php b/tests/Doctrine/Tests/ORM/Functional/EntityRepositoryTest.php index 5be4615fb..7874435bd 100644 --- a/tests/Doctrine/Tests/ORM/Functional/EntityRepositoryTest.php +++ b/tests/Doctrine/Tests/ORM/Functional/EntityRepositoryTest.php @@ -781,6 +781,22 @@ class EntityRepositoryTest extends \Doctrine\Tests\OrmFunctionalTestCase $this->assertEquals(4, count($users)); } + public function testMatchingCriteriaContainsComparison() + { + $this->loadFixture(); + + $repository = $this->_em->getRepository('Doctrine\Tests\Models\CMS\CmsUser'); + + $users = $repository->matching(new Criteria(Criteria::expr()->contains('name', 'Foobar'))); + $this->assertEquals(0, count($users)); + + $users = $repository->matching(new Criteria(Criteria::expr()->contains('name', 'Rom'))); + $this->assertEquals(1, count($users)); + + $users = $repository->matching(new Criteria(Criteria::expr()->contains('status', 'dev'))); + $this->assertEquals(2, count($users)); + } + /** * @group DDC-2055 */