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

Merge pull request #6740 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

View File

@ -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);

View File

@ -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];
}
/**

View File

@ -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));
}
}