Add type detection. Needed by pdo_dblib
This commit is contained in:
parent
2cc6bdaad1
commit
bd78fbd1c3
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user