1
0
mirror of synced 2025-03-14 08:36:09 +03:00

Merge pull request from mduplouy/DDC288

Fix operator when using criteria on ManyToMany

Fixes: https://github.com/doctrine/common/issues/600
This commit is contained in:
Luís Cobucci 2017-11-26 14:21:57 +01:00 committed by GitHub
commit dfc31bc855
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 117 additions and 8 deletions
lib/Doctrine/ORM/Persisters
tests/Doctrine/Tests/ORM/Functional/Ticket

@ -259,10 +259,11 @@ class ManyToManyPersister extends AbstractCollectionPersister
$parameters = $this->expandCriteriaParameters($criteria); $parameters = $this->expandCriteriaParameters($criteria);
foreach ($parameters as $parameter) { foreach ($parameters as $parameter) {
list($name, $value) = $parameter; [$name, $value, $operator] = $parameter;
$field = $this->quoteStrategy->getColumnName($name, $targetClass, $this->platform);
$whereClauses[] = sprintf('te.%s = ?', $field); $field = $this->quoteStrategy->getColumnName($name, $targetClass, $this->platform);
$params[] = $value; $whereClauses[] = sprintf('te.%s %s ?', $field, $operator);
$params[] = $value;
} }
$tableName = $this->quoteStrategy->getTableName($targetClass, $this->platform); $tableName = $this->quoteStrategy->getTableName($targetClass, $this->platform);

@ -50,9 +50,9 @@ class SqlValueVisitor extends ExpressionVisitor
*/ */
public function walkComparison(Comparison $comparison) public function walkComparison(Comparison $comparison)
{ {
$value = $this->getValueFromComparison($comparison); $value = $this->getValueFromComparison($comparison);
$field = $comparison->getField(); $field = $comparison->getField();
$operator = $comparison->getOperator(); $operator = $comparison->getOperator();
if (($operator === Comparison::EQ || $operator === Comparison::IS) && $value === null) { if (($operator === Comparison::EQ || $operator === Comparison::IS) && $value === null) {
return; return;
@ -61,7 +61,7 @@ class SqlValueVisitor extends ExpressionVisitor
} }
$this->values[] = $value; $this->values[] = $value;
$this->types[] = [$field, $value]; $this->types[] = [$field, $value, $operator];
} }
/** /**

@ -0,0 +1,108 @@
<?php
namespace Doctrine\Tests\ORM\Functional\Ticket;
use Doctrine\Tests\OrmFunctionalTestCase;
use Doctrine\Tests\Models\ECommerce\ECommerceProduct;
use Doctrine\Tests\Models\ECommerce\ECommerceCategory;
use Doctrine\Common\Collections\Criteria;
final class GH6740Test extends OrmFunctionalTestCase
{
/**
* @var int
*/
private $productId;
/**
* @var int
*/
private $firstCategoryId;
/**
* @var int
*/
private $secondCategoryId;
public function setUp() : void
{
$this->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));
}
}