Skip to content

Commit

Permalink
[DoctrineBridge] Fixed submitting invalid ids when using queries with…
Browse files Browse the repository at this point in the history
… limit
  • Loading branch information
HeahDude committed Dec 9, 2019
1 parent bf877b8 commit 61b4aac
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
Expand Up @@ -55,6 +55,26 @@ public function getEntities()
*/
public function getEntitiesByIds($identifier, array $values)
{
if (null !== $this->queryBuilder->getMaxResults()) {
$metadata = $this->queryBuilder->getEntityManager()->getClassMetadata(current($this->queryBuilder->getRootEntities()));

$choices = $unordered = [];

foreach ($this->getEntities() as $entity) {
$id = current($metadata->getIdentifierValues($entity));
if (false !== $i = array_search($id, $values, true)) {
$choices[$i] = $entity;
}
}
foreach ($values as $i => $value) {
if (isset($unordered[$i])) {
$choices[$i] = $unordered[$i];
}
}

return $choices;
}

$qb = clone $this->queryBuilder;
$alias = current($qb->getRootAliases());
$parameter = 'ORMQueryBuilderLoader_getEntitiesByIds_'.$identifier;
Expand Down
28 changes: 28 additions & 0 deletions src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php
Expand Up @@ -955,6 +955,32 @@ public function testDisallowChoicesThatAreNotIncludedQueryBuilderSingleIdentifie
$this->assertNull($field->getData());
}

public function testDisallowChoicesThatAreNotIncludedQueryBuilderSingleIdentifierWithLimit()
{
$entity1 = new SingleIntIdEntity(1, 'Foo');
$entity2 = new SingleIntIdEntity(2, 'Bar');
$entity3 = new SingleIntIdEntity(3, 'Baz');

$this->persist([$entity1, $entity2, $entity3]);

$repository = $this->em->getRepository(self::SINGLE_IDENT_CLASS);

$field = $this->factory->createNamed('name', static::TESTED_TYPE, null, [
'em' => 'default',
'class' => self::SINGLE_IDENT_CLASS,
'query_builder' => $repository->createQueryBuilder('e')
->where('e.id IN (1, 2, 3)')
->setMaxResults(1)
,
'choice_label' => 'name',
]);

$field->submit('3');

$this->assertFalse($field->isSynchronized());
$this->assertNull($field->getData());
}

public function testDisallowChoicesThatAreNotIncludedQueryBuilderSingleAssocIdentifier()
{
$innerEntity1 = new SingleIntIdNoToStringEntity(1, 'InFoo');
Expand Down Expand Up @@ -1007,6 +1033,8 @@ public function testDisallowChoicesThatAreNotIncludedQueryBuilderAsClosureSingle
$this->assertNull($field->getData());
}



public function testDisallowChoicesThatAreNotIncludedQueryBuilderAsClosureCompositeIdentifier()
{
$entity1 = new CompositeIntIdEntity(10, 20, 'Foo');
Expand Down

0 comments on commit 61b4aac

Please sign in to comment.