Как можно исправить результат стандартной выборки из репозитория при использовании Symfony\Component\Uid\Ulid в качестве первичного ключа для данных сущностей?
To configure a Symfony OneToMany relationship with eager fetching using ULID as the primary key, you can follow these steps: 1. Define your entities with ULID as the primary key. ```php // Your parent entity class ParentEntity { /** * @ORM\Id * @ORM\Column(type="ulid") */ private $id; /** * @ORM\OneToMany(targetEntity="ChildEntity", mappedBy="parent") */ private $children; } // Your child entity class ChildEntity { /** * @ORM\Id * @ORM\Column(type="ulid") */ private $id; /** * @ORM\ManyToOne(targetEntity="ParentEntity", inversedBy="children") */ private $parent; } ``` 2. Configure the relationship in your repository or directly in your Symfony controller. ```php // In your repository class ParentEntityRepository extends EntityRepository { public function findParentWithChildren($id) { return $this->createQueryBuilder('p') ->select('p', 'c') ->leftJoin('p.children', 'c') ->where('p.id = :id') ->setParameter('id', $id) ->getQuery() ->getOneOrNullResult(); } } ``` 3. Fetch the data with eager loading in your controller. ```php // In your controller $parent = $this->getDoctrine()->getRepository(ParentEntity::class)->findParentWithChildren($parentId); ``` By configuring your entities and repository as shown above, you can retrieve data with eager loading and use ULID as the primary key for your Symfony OneToMany relationship.
Если я ничего не путаю, то у Доктрины постоянно что-то не так с кастомными типами. Попробуйте, может быть, заменить строкой в PHP, а в атрибуте указать тип 'guid', который и база и доктрина хорошо кушают.
<?php declare(strict_types=1); namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Uid\Ulid; #[ORM\Entity] #[UniqueEntity(fields: ['identifier'])] class Foo { #[ORM\Id] #[ORM\Column(type: 'guid', length: 16, unique: true)] private string $identifier; public function __construct() { $this->identifier = (new Ulid())->toRfc4122(); } public function getIdentifier(): string { return $this->identifier; } }
Стоило бы посмотреть как sql запрос в итоге формируется и где происходит несоответствие форматов.
При передаче в качестве параметра запроса можно явно сконвертировать Ulid в нужный формат:
$entity->getUlid()->toBase32()