Fetching association throws "Unknown parameter type, 116 given" exception
delolmo opened this issue ยท 6 comments
Tbh, I am not 100% sure that this issue lies within this library, within doctrine/orm
or within doctrine/dbal
. Having said that, let me share my findings on what is happening to me.
The project in question is based on doctrine/orm
, which is being tested locally with the pdo_sqlite
library. I have two very basic entities with the following mapping:
#[ORM\Entity]
#[ORM\Table(name: 'accounts')]
#[ORM\InheritanceType('SINGLE_TABLE')]
#[ORM\DiscriminatorColumn(name: 'type', type: 'string')]
#[ORM\DiscriminatorMap([
'organization' => Organization::class,
'user' => User::class,
])]
abstract class Account
{
public function __construct(
#[ORM\Id]
#[ORM\Column(type: 'uuid_binary')]
private UuidInterface $id,
#[ORM\Column(type: 'string', unique: true)]
private string $name,
#[ORM\Column(type: 'string', unique: true)]
private string $email,
#[ORM\Column(type: 'string', enumType: Level::class)]
private Level $level,
#[ORM\Column(type: 'datetime_immutable')]
private DateTimeImmutable $createdAt,
) {
}
#[ORM\Entity]
class User extends Account
{
}
#[ORM\Entity]
class Organization extends Account
{
}
Plus an association class with the following definition:
#[ORM\Entity]
#[ORM\Table(name: 'accounts_members')]
#[ORM\UniqueConstraint(columns: ['organization_id', 'user_id'])]
class Member
{
final public function __construct(
#[ORM\Id]
#[ORM\Column(type: 'uuid_binary')]
private UuidInterface $id,
#[ORM\ManyToOne(targetEntity: Organization::class, fetch: 'EAGER')]
#[ORM\JoinColumn(name: 'organization_id', referencedColumnName: 'id')]
private Organization $organization,
#[ORM\ManyToOne(targetEntity: User::class, fetch: 'EAGER')]
#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id')]
private User $user,
#[ORM\Column(type: 'string', enumType: Role::class)]
private Role $role,
) {
}
}
I believe the entities are self-explanatory, but I will be happy to provide more context if necessary.
That being said, I am running this code inside the controller:
$entityManager = $this->getEntityManager();
$repo = $entityManager->getRepository(Member::class);
$all = $repo->findAll();
After which I am getting the following Exception:
In ExceptionConverter.php line 83:
[Doctrine\DBAL\Exception\DriverException]
An exception occurred while executing a query: Unknown parameter type, 116 given.
Exception trace:
at /.web/model/vendor/doctrine/dbal/src/Driver/API/SQLite/ExceptionConverter.php:83
Doctrine\DBAL\Driver\API\SQLite\ExceptionConverter->convert() at /.web/model/vendor/doctrine/dbal/src/Connection.php:1907
Doctrine\DBAL\Connection->handleDriverException() at /.web/model/vendor/doctrine/dbal/src/Connection.php:1850
Doctrine\DBAL\Connection->convertExceptionDuringQuery() at /.web/model/vendor/doctrine/dbal/src/Connection.php:1069
Doctrine\DBAL\Connection->executeQuery() at /.web/model/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php:916
Doctrine\ORM\Persisters\Entity\BasicEntityPersister->loadAll() at /.web/model/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:3015
Doctrine\ORM\UnitOfWork->triggerEagerLoads() at /.web/model/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php:68
Doctrine\ORM\Internal\Hydration\SimpleObjectHydrator->hydrateAllData() at /.web/model/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:270
Doctrine\ORM\Internal\Hydration\AbstractHydrator->hydrateAll() at /.web/model/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php:920
Doctrine\ORM\Persisters\Entity\BasicEntityPersister->loadAll() at /.web/model/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php:225
Doctrine\ORM\EntityRepository->findBy() at /.web/model/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php:207
Doctrine\ORM\EntityRepository->findAll() at /.web/model/src/Handler/ListMembers.php:19
App\Handler\ListMembers->__invoke() at /.web/model/src/Console/Command/ListMembers.php:27
App\Controller\ListMembers->execute() at /.web/model/vendor/symfony/console/Command/Command.php:312
Symfony\Component\Console\Command\Command->run() at /.web/model/vendor/symfony/console/Application.php:1022
Symfony\Component\Console\Application->doRunCommand() at /.web/model/vendor/symfony/console/Application.php:314
Symfony\Component\Console\Application->doRun() at /.web/model/vendor/symfony/console/Application.php:168
Symfony\Component\Console\Application->run() at /.web/model/bin/console:34
After some investigation into the issue, I found out that the misterious unknown parameter 116 is 'created' here:
Doctrine\ORM\Persisters\Entity\BasicEntityPersister->loadAll()
Which eventually calls this (the actual line where the 116 is 'added'):
Does anyone have any idea why I am getting this error?
Locked versions of the libraries are:
doctrine/orm
,2.14.1
ramsey/uuid-doctrine
,2.0.0
ramsey/uuid
,4.7.3
I have actually revisited this and it is in fact a bug in the library. Changing every primary key from 'uuid_binary' type to 'uuid' made everything work fine again.
I had the same issue with v2.x. Rolling back to v1 helped. Didn't notice anything in the CHANGELOG.md
Same here with:
ramsey/uuid: 4.7.4
ramsey/uuid-doctrine: 2.0.0
doctrine/orm: 2.15.2
It seems it's a bug on ORM side doctrine/orm#7835
TLDR; findBy
doesn't accept non-builtin array types
Helped rewriting findBy
calls by query builder.
@acelot Can you provide more details on what you mean by "helped rewriting findBy
calls by query builder?"
FYI as its not mentined here. Error "Unknown parameter type, 116 given" is caused by #72 (released in 2.0.0) and already fixed upstream in PR doctrine/dbal#5994 . ArrayParametrType does not support BINARY type right now. After applying patch from PR everything is working as expected.