-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Closed
Description
Bug Report
| Q | A |
|---|---|
| BC Break | no |
| Version | 2.6.3 |
Summary
When using a Doctrine\ORM\Tools\Pagination\Paginator to iterate over a query that has entities with a custom DBAL type used in the identifier, then $id->__toString() is used implicitly by PDO, instead of being converted by the Doctrine\DBAL\Types system.
In order to reproduce this, you must have identifiers implementing #__toString() (to allow the UnitOfWork to hash them) and other accessors that are used by the custom DBAL type during DB/PHP conversions. If #__toString() and the DBAL type conversions are asymmetric, then the paginator will fail to find records.
Tricky situation, but this very much affects ramsey/uuid-doctrine and anyone relying on the uuid_binary.
Current behavior
class MyEntity {
public TheId $id;
}
class TheId {
public function toId() : string
{
return 'yep';
}
public function __toString() : string
{
return 'nope';
}
}
class TheIdType extends StringType
{
public function convertToDatabaseValue($value, $platform)
{
return $value->toId();
}
}
$entity = new MyEntity();
$entity->id = new TheId();
$em->persist($entity);
$em->flush();
$paginator = (new Paginator($em->createQuery('SELECT f FROM ' . MyEntity::class . ' f'));
foreach ($paginator as $entry) {
die('this won't be reached with current ORM state');
}Expected behavior
The code above should loop over one found record.
Reactions are currently unavailable