我在 Symfony 应用程序中使用 Doctrine 通过 UUID 检索用户时遇到问题,经过几个小时的努力却没有任何真正的线索,我决定在这里提出这个问题,以防我错过了一些明显的东西。
问题:
我有一个 Symfony 应用程序,其中用户由 UUID 标识。我尝试使用 Doctrine 的 findBy 方法从 UUID 列表中检索用户,但即使 UUID 存在于数据库中,我也会系统地得到一个空数组。
这是我的 $id 字段:
trait UuidTrait
{
#[ORM\Id]
#[ORM\Column(type: UuidType::NAME, unique: true)]
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
#[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
private ?Uuid $id = null;
public function getId(): ?Uuid
{
return $this->id;
}
}
我的用于检索用户的代码:
$ids = ["018dd095-4c15-78b4-8f45-6c0bdc78368e","018dd226-5561-7b24-8677-64fa33a0267b"];
$users = $userRepository->findBy(["id" => $ids]); // -> empty array
我尝试使用以下方法将字符串转换为 UUID:
$ids = array_map(fn (string $id) => Uuid::fromString($id), $ids);
但还是没成功...
我检查了我的 ID:
$users = $userRepository->findBy(["id" => $ids[0]]);
$users 包含 1 个用户,所以我的 ID 很好。
最糟糕的是没有抛出任何错误,所以我不知道问题出在哪里。我见过几个人使用数组作为标准参数(here),所以我认为它可以工作。
预先感谢任何可以帮助我的人。
地理
编辑:在学说文档中看到this,我的代码看起来是正确的
Doctrine 似乎无法一次处理所有 UUID 列表。因此,我想出了一个解决方案来处理这种情况。希望它对您有用!
public function fetchByUuids(array $uuids){
$qb = $this->createQueryBuilder('m');
$expr = $qb->expr()->orX();
foreach ($uuids as $key => $uuid) {
$paramName = 'id_' . $key;
$expr->add($qb->expr()->eq('m.id', ':' . $paramName));
$qb->setParameter($paramName, $uuid, UuidType::NAME);
}
$qb->andWhere($expr);
return $qb->getQuery()->getResult();
}
#[Route(path: '/home', name: 'home', methods: ['GET'])]
public function home(MoviesRepository $subscriberRepository)
{
$ids = ['0188324d-103f-79dc-b313-fe8f85b9aaf4','0188324d-103f-79dc-b313-fe8f8adb328c'];
dd($subscriberRepository->fetchByUuids($ids));
}