8000 [Form] Fixed: Filter non-integers when selecting entities by int ID · symfony/symfony@352be8e · GitHub
[go: up one dir, main page]

Skip to content

Commit 352be8e

Browse files
committed
[Form] Fixed: Filter non-integers when selecting entities by int ID
1 parent d23d3c9 commit 352be8e

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

src/Symfony/Bridge/Doctrine/Form/ChoiceList/ORMQueryBuilderLoader.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,12 @@ public function getEntitiesByIds($identifier, array $values)
9999
$metadata = $qb->getEntityManager()->getClassMetadata($entity);
100100
if (in_array($metadata->getTypeOfField($identifier), array('integer', 'bigint', 'smallint'))) {
101101
$parameterType = Connection::PARAM_INT_ARRAY;
102+
103+
// Filter out non-integer values (e.g. ""). If we don't, some
104+
// databases such as PostgreSQL fail.
105+
$values = array_values(array_filter($values, function ($v) {
106+
return (string) $v === (string) (int) $v;
107+
}));
102108
} else {
103109
$parameterType = Connection::PARAM_STR_ARRAY;
104110
}

src/Symfony/Bridge/Doctrine/Tests/Form/ChoiceList/ORMQueryBuilderLoaderTest.php

Lines changed: 34 additions & 4 deletions
10000
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use Symfony\Bridge\Doctrine\Test\DoctrineTestHelper;
1616
use Doctrine\DBAL\Connection;
1717

18-
class ORMQueryBuilderLoaderTest extends DoctrineTestHelper
18+
class ORMQueryBuilderLoaderTest extends \PHPUnit_Framework_TestCase
1919
{
2020
/**
2121
* @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
@@ -27,6 +27,7 @@ public function testItOnlyWorksWithQueryBuilderOrClosure()
2727

2828
/**
2929
* @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
30+
* @group legacy
3031
*/
3132
public function testClosureRequiresTheEntityManager()
3233
{
@@ -47,7 +48,7 @@ public function testIdentifierTypeIsIntegerArray()
4748

4849
protected function checkIdentifierType($classname, $expectedType)
4950
{
50-
$em = $this->createTestEntityManager();
51+
$em = DoctrineTestHelper::createTestEntityManager();
5152

5253
$query = $this->getMockBuilder('QueryMock')
5354
->setMethods(array('setParameter', 'getResult', 'getSql', '_doExecute'))
@@ -56,7 +57,7 @@ protected function checkIdentifierType($classname, $expectedType)
5657
$query->expects($this->once())
5758
->method('setParameter')
5859
->with('ORMQueryBuilderLoader_getEntitiesByIds_id', array(), $expectedType)
59-
->will($this->returnValue($query));
60+
->willReturn($query);
6061

6162
$qb = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
6263
->setConstructorArgs(array($em))
@@ -65,12 +66,41 @@ protected function checkIdentifierType($classname, $expectedType)
6566

6667
$qb->expects($this->once())
6768
->method('getQuery')
68-
->will($this->returnValue($query));
69+
->willReturn($query);
6970

7071
$qb->select('e')
7172
->from($classname, 'e');
7273

7374
$loader = new ORMQueryBuilderLoader($qb);
7475
$loader->getEntitiesByIds('id', array());
7576
}
77+
78+
public function testFilterNonIntegerValues()
79+
{
80+
$em = DoctrineTestHelper::createTestEntityManager();
81+
82+
$query = $this->getMockBuilder('QueryMock')
83+
->setMethods(array('setParameter', 'getResult', 'getSql', '_doExecute'))
84+
->getMock();
85+
86+
$query->expects($this->once())
87+
->method('setParameter')
88+
->with('ORMQueryBuilderLoader_getEntitiesByIds_id', array(1, 2, 3), Connection::PARAM_INT_ARRAY)
89+
->willReturn($query);
90+
91+
$qb = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
92+
->setConstructorArgs(array($em))
93+
->setMethods(array('getQuery'))
94+
->getMock();
95+
96+
$qb->expects($this->once())
97+
->method('getQuery')
98+
->willReturn($query);
99+
100+
$qb->select('e')
101+
->from('Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity', 'e');
102+
103+
$loader = new ORMQueryBuilderLoader($qb);
104+
$loader->getEntitiesByIds('id', array(1, '', 2, 3, 'foo'));
105+
}
76106
}

0 commit comments

Comments
 (0)
0