Add type detection. Needed by pdo_dblib

This commit is contained in:
iamluc 2013-12-12 11:29:54 +01:00 committed by Fabien Potencier
parent 2cc6bdaad1
commit bd78fbd1c3
2 changed files with 52 additions and 2 deletions

View File

@ -81,9 +81,18 @@ class ORMQueryBuilderLoader implements EntityLoaderInterface
$parameter = 'ORMQueryBuilderLoader_getEntitiesByIds_'.$identifier;
$where = $qb->expr()->in($alias.'.'.$identifier, ':'.$parameter);
// Guess type
$entity = current($qb->getRootEntities());
$metadata = $qb->getEntityManager()->getClassMetadata($entity);
if (in_array($metadata->getTypeOfField($identifier), array('integer', 'bigint', 'smallint'))) {
$parameterType = Connection::PARAM_INT_ARRAY;
} else {
$parameterType = Connection::PARAM_STR_ARRAY;
}
return $qb->andWhere($where)
->getQuery()
->setParameter($parameter, $values, Connection::PARAM_STR_ARRAY)
->setParameter($parameter, $values, $parameterType)
->getResult();
}
}

View File

@ -12,8 +12,10 @@
namespace Symfony\Bridge\Doctrine\Tests\Form\ChoiceList;
use Symfony\Bridge\Doctrine\Form\ChoiceList\ORMQueryBuilderLoader;
use Symfony\Bridge\Doctrine\Tests\DoctrineOrmTestCase;
use Doctrine\DBAL\Connection;
class ORMQueryBuilderLoaderTest extends \PHPUnit_Framework_TestCase
class ORMQueryBuilderLoaderTest extends DoctrineOrmTestCase
{
/**
* @expectedException \Symfony\Component\Form\Exception\UnexpectedTypeException
@ -32,4 +34,43 @@ class ORMQueryBuilderLoaderTest extends \PHPUnit_Framework_TestCase
new ORMQueryBuilderLoader($closure);
}
public function testIdentifierTypeIsStringArray()
{
$this->checkIdentifierType('Symfony\Bridge\Doctrine\Tests\Fixtures\SingleStringIdEntity', Connection::PARAM_STR_ARRAY);
}
public function testIdentifierTypeIsIntegerArray()
{
$this->checkIdentifierType('Symfony\Bridge\Doctrine\Tests\Fixtures\SingleIntIdEntity', Connection::PARAM_INT_ARRAY);
}
protected function checkIdentifierType($classname, $expectedType)
{
$em = $this->createTestEntityManager();
$query = $this->getMockBuilder('QueryMock')
->setMethods(array('setParameter', 'getResult', 'getSql', '_doExecute'))
->getMock();
$query->expects($this->once())
->method('setParameter')
->with('ORMQueryBuilderLoader_getEntitiesByIds_id', array(), $expectedType)
->will($this->returnValue($query));
$qb = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
->setConstructorArgs(array($em))
->setMethods(array('getQuery'))
->getMock();
$qb->expects($this->once())
->method('getQuery')
->will($this->returnValue($query));
$qb->select('e')
->from($classname, 'e');
$loader = new ORMQueryBuilderLoader($qb);
$loader->getEntitiesByIds('id', array());
}
}