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