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

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 45579fd

Browse files
webmozartnicolas-grekas
authored andcommitted
[Form] Fixed: Filter non-integers when selecting entities by int ID
1 parent 17ffb5a commit 45579fd

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
@@ -86,6 +86,12 @@ public function getEntitiesByIds($identifier, array $values)
8686
$metadata = $qb->getEntityManager()->getClassMetadata($entity);
8787
if (in_array($metadata->getTypeOfField($identifier), array('integer', 'bigint', 'smallint'))) {
8888
$parameterType = Connection::PARAM_INT_ARRAY;
89+
90+
// Filter out non-integer values (e.g. ""). If we don't, some
91+
// databases such as PostgreSQL fail.
92+
$values = array_values(array_filter($values, function ($v) {
93+
return (string) $v === (string) (int) $v;
94+
}));
8995
} else {
9096
$parameterType = Connection::PARAM_STR_ARRAY;
9197
}

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

Lines changed: 34 additions & 4 deletions
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()
4 10000 748

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