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:
commit
dfc31bc855
@ -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);
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
/**
|
||||
|
108
tests/Doctrine/Tests/ORM/Functional/Ticket/GH6740Test.php
Normal file
108
tests/Doctrine/Tests/ORM/Functional/Ticket/GH6740Test.php
Normal 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));
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user