diff --git a/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php b/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php index 176ef37ee..84d5ccfbc 100644 --- a/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php +++ b/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php @@ -259,10 +259,11 @@ class ManyToManyPersister extends AbstractCollectionPersister $parameters = $this->expandCriteriaParameters($criteria); foreach ($parameters as $parameter) { - list($name, $value) = $parameter; - $field = $this->quoteStrategy->getColumnName($name, $targetClass, $this->platform); - $whereClauses[] = sprintf('te.%s = ?', $field); - $params[] = $value; + [$name, $value, $operator] = $parameter; + + $field = $this->quoteStrategy->getColumnName($name, $targetClass, $this->platform); + $whereClauses[] = sprintf('te.%s %s ?', $field, $operator); + $params[] = $value; } $tableName = $this->quoteStrategy->getTableName($targetClass, $this->platform); diff --git a/lib/Doctrine/ORM/Persisters/SqlValueVisitor.php b/lib/Doctrine/ORM/Persisters/SqlValueVisitor.php index 78fd0333b..a5df126c4 100644 --- a/lib/Doctrine/ORM/Persisters/SqlValueVisitor.php +++ b/lib/Doctrine/ORM/Persisters/SqlValueVisitor.php @@ -50,9 +50,9 @@ class SqlValueVisitor extends ExpressionVisitor */ public function walkComparison(Comparison $comparison) { - $value = $this->getValueFromComparison($comparison); - $field = $comparison->getField(); - $operator = $comparison->getOperator(); + $value = $this->getValueFromComparison($comparison); + $field = $comparison->getField(); + $operator = $comparison->getOperator(); if (($operator === Comparison::EQ || $operator === Comparison::IS) && $value === null) { return; @@ -61,7 +61,7 @@ class SqlValueVisitor extends ExpressionVisitor } $this->values[] = $value; - $this->types[] = [$field, $value]; + $this->types[] = [$field, $value, $operator]; } /** diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/GH6740Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/GH6740Test.php new file mode 100644 index 000000000..3589fa2fb --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/GH6740Test.php @@ -0,0 +1,108 @@ +useModelSet('ecommerce'); + + parent::setUp(); + + $product = new ECommerceProduct(); + $product->setName('First Product'); + + $firstCategory = new ECommerceCategory(); + $secondCategory = new ECommerceCategory(); + + $firstCategory->setName('Business'); + $secondCategory->setName('Home'); + + $product->addCategory($firstCategory); + $product->addCategory($secondCategory); + + $this->_em->persist($product); + $this->_em->flush(); + $this->_em->clear(); + + $this->productId = $product->getId(); + $this->firstCategoryId = $firstCategory->getId(); + $this->secondCategoryId = $secondCategory->getId(); + } + + /** + * @group 6740 + */ + public function testCollectionFilteringLteOperator() : void + { + $product = $this->_em->find(ECommerceProduct::class, $this->productId); + $criteria = Criteria::create()->where(Criteria::expr()->lte('id', $this->secondCategoryId)); + + self::assertCount(2, $product->getCategories()->matching($criteria)); + } + + /** + * @group 6740 + */ + public function testCollectionFilteringLtOperator() : void + { + $product = $this->_em->find(ECommerceProduct::class, $this->productId); + $criteria = Criteria::create()->where(Criteria::expr()->lt('id', $this->secondCategoryId)); + + self::assertCount(1, $product->getCategories()->matching($criteria)); + } + + /** + * @group 6740 + */ + public function testCollectionFilteringGteOperator() : void + { + $product = $this->_em->find(ECommerceProduct::class, $this->productId); + $criteria = Criteria::create()->where(Criteria::expr()->gte('id', $this->firstCategoryId)); + + self::assertCount(2, $product->getCategories()->matching($criteria)); + } + + /** + * @group 6740 + */ + public function testCollectionFilteringGtOperator() : void + { + $product = $this->_em->find(ECommerceProduct::class, $this->productId); + $criteria = Criteria::create()->where(Criteria::expr()->gt('id', $this->firstCategoryId)); + + self::assertCount(1, $product->getCategories()->matching($criteria)); + } + + /** + * @group 6740 + */ + public function testCollectionFilteringEqualsOperator() : void + { + $product = $this->_em->find(ECommerceProduct::class, $this->productId); + $criteria = Criteria::create()->where(Criteria::expr()->eq('id', $this->firstCategoryId)); + + self::assertCount(1, $product->getCategories()->matching($criteria)); + } +}