Fix parameter name comparison in QueryBuilder#setParameter() with different types
This commit is contained in:
parent
6cb5a9c50a
commit
b8fd708139
@ -532,26 +532,15 @@ class QueryBuilder
|
|||||||
*/
|
*/
|
||||||
public function setParameter($key, $value, $type = null)
|
public function setParameter($key, $value, $type = null)
|
||||||
{
|
{
|
||||||
$filteredParameters = $this->parameters->filter(
|
$existingParameter = $this->getParameter($key);
|
||||||
function ($parameter) use ($key)
|
|
||||||
{
|
|
||||||
/* @var Query\Parameter $parameter */
|
|
||||||
// Must not be identical because of string to integer conversion
|
|
||||||
return ($key == $parameter->getName());
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
if (count($filteredParameters)) {
|
if ($existingParameter !== null) {
|
||||||
/* @var Query\Parameter $parameter */
|
$existingParameter->setValue($value, $type);
|
||||||
$parameter = $filteredParameters->first();
|
|
||||||
$parameter->setValue($value, $type);
|
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
$parameter = new Query\Parameter($key, $value, $type);
|
$this->parameters->add(new Query\Parameter($key, $value, $type));
|
||||||
|
|
||||||
$this->parameters->add($parameter);
|
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@ -614,15 +603,14 @@ class QueryBuilder
|
|||||||
public function getParameter($key)
|
public function getParameter($key)
|
||||||
{
|
{
|
||||||
$filteredParameters = $this->parameters->filter(
|
$filteredParameters = $this->parameters->filter(
|
||||||
function ($parameter) use ($key)
|
function (Query\Parameter $parameter) use ($key) : bool {
|
||||||
{
|
$parameterName = $parameter->getName();
|
||||||
/* @var Query\Parameter $parameter */
|
|
||||||
// Must not be identical because of string to integer conversion
|
return $key === $parameterName || (string) $key === (string) $parameterName;
|
||||||
return ($key == $parameter->getName());
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
return count($filteredParameters) ? $filteredParameters->first() : null;
|
return ! $filteredParameters->isEmpty() ? $filteredParameters->first() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1158,4 +1158,81 @@ class QueryBuilderTest extends OrmTestCase
|
|||||||
|
|
||||||
$this->assertEquals(['u', 'g'], $aliases);
|
$this->assertEquals(['u', 'g'], $aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group 6699
|
||||||
|
*/
|
||||||
|
public function testGetParameterTypeJuggling() : void
|
||||||
|
{
|
||||||
|
$builder = $this->_em->createQueryBuilder()
|
||||||
|
->select('u')
|
||||||
|
->from(CmsUser::class, 'u')
|
||||||
|
->where('u.id = ?0');
|
||||||
|
|
||||||
|
$builder->setParameter(0, 0);
|
||||||
|
|
||||||
|
self::assertCount(1, $builder->getParameters());
|
||||||
|
self::assertSame(0, $builder->getParameter(0)->getValue());
|
||||||
|
self::assertSame(0, $builder->getParameter('0')->getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group 6699
|
||||||
|
*/
|
||||||
|
public function testSetParameterWithNameZeroIsNotOverridden() : void
|
||||||
|
{
|
||||||
|
$builder = $this->_em->createQueryBuilder()
|
||||||
|
->select('u')
|
||||||
|
->from(CmsUser::class, 'u')
|
||||||
|
->where('u.id != ?0')
|
||||||
|
->andWhere('u.username = :name');
|
||||||
|
|
||||||
|
$builder->setParameter(0, 0);
|
||||||
|
$builder->setParameter('name', 'Doctrine');
|
||||||
|
|
||||||
|
self::assertCount(2, $builder->getParameters());
|
||||||
|
self::assertSame(0, $builder->getParameter('0')->getValue());
|
||||||
|
self::assertSame('Doctrine', $builder->getParameter('name')->getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group 6699
|
||||||
|
*/
|
||||||
|
public function testSetParameterWithNameZeroDoesNotOverrideAnotherParameter() : void
|
||||||
|
{
|
||||||
|
$builder = $this->_em->createQueryBuilder()
|
||||||
|
->select('u')
|
||||||
|
->from(CmsUser::class, 'u')
|
||||||
|
->where('u.id != ?0')
|
||||||
|
->andWhere('u.username = :name');
|
||||||
|
|
||||||
|
$builder->setParameter('name', 'Doctrine');
|
||||||
|
$builder->setParameter(0, 0);
|
||||||
|
|
||||||
|
self::assertCount(2, $builder->getParameters());
|
||||||
|
self::assertSame(0, $builder->getParameter(0)->getValue());
|
||||||
|
self::assertSame('Doctrine', $builder->getParameter('name')->getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group 6699
|
||||||
|
*/
|
||||||
|
public function testSetParameterWithTypeJugglingWorks() : void
|
||||||
|
{
|
||||||
|
$builder = $this->_em->createQueryBuilder()
|
||||||
|
->select('u')
|
||||||
|
->from(CmsUser::class, 'u')
|
||||||
|
->where('u.id != ?0')
|
||||||
|
->andWhere('u.username = :name');
|
||||||
|
|
||||||
|
$builder->setParameter('0', 1);
|
||||||
|
$builder->setParameter('name', 'Doctrine');
|
||||||
|
$builder->setParameter(0, 2);
|
||||||
|
$builder->setParameter('0', 3);
|
||||||
|
|
||||||
|
self::assertCount(2, $builder->getParameters());
|
||||||
|
self::assertSame(3, $builder->getParameter(0)->getValue());
|
||||||
|
self::assertSame(3, $builder->getParameter('0')->getValue());
|
||||||
|
self::assertSame('Doctrine', $builder->getParameter('name')->getValue());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user