gpt4 book ai didi

php - DQL 无法通过一对一关系作为参数解析主键

转载 作者:行者123 更新时间:2023-12-03 17:00:45 28 4
gpt4 key购买 nike

我使用一对一的关系作为实体的 id:

Actor 实体

$metadata->mapOneToOne([
'fieldName' => 'user',
'id' => true,
'targetEntity' => AbstractUser::class,
'inversedBy' => 'actor',
'cascade' => ['all'],
'joinColumns' => [
[
'name' => 'user_id',
'referencedColumnName' => 'id',
'nullable' => false,
]
],
]);

另一边:

摘要用户实体
$metadata->mapField([
'fieldName' => 'id',
'type' => 'string',
'length' => 36,
'id' => true,
'strategy' => 'none',
'unique' => true,
]);

$metadata->mapOneToOne([
'fieldName' => 'actor',
'targetEntity' => Actor::class,
'mappedBy' => 'user',
'cascade' => ['all'],
]);

然后我有第三个实体( 订阅 )引用 Actor 实体:
$metadata->mapManyToOne([
'fieldName' => 'subscribingActor',
'targetEntity' => Actor::class,
'joinColumns' => [
[
'name' => 'subscribing_actor_id',
'referencedColumnName' => 'user_id',
'nullable' => false,
],
],
]);

我尝试运行的查询如下所示:
function findByActors(Actor $subscribingActor, Actor $subscribedActor): ?Subscription
{
$qb = $this->entityRepository->createQueryBuilder('s');
$qb
->where('s.subscribingActor = :subscribingActor')
->setParameter('subscribingActor', $subscribingActor);

return $qb->getQuery()->getOneOrNullResult();
}

这会导致以下异常:

Object of InternalUser (extends AbstractUser) could not be converted to string



如果我实现 AbstractUser::__toString()返回用户的 id 一切正常。

奇怪的是:如果我从数据库中新加载实体,它就可以工作。如果我创建它,将其持久化并使用每个实体对象,我都会收到上述“to string”错误。

我现在的问题是,为什么 Doctrine 无法通过 mapOneToOne 检测到 id 值? -> joinColumns[0]['referencedColumnName']信息,而是尝试调用 __toString()在相关对象上,尽管从映射中可以清楚地看出它可以在哪里找到相关实体的 PK 值,但前提是该实体最初不是从数据库中加载的?

最佳答案

不知何故, Doctrine 无法确定 Actor 的 PK实体通过映射。提供原始实体User帮助 Doctrine 解决一切:

function findByActors(Actor $subscribingActor, Actor $subscribedActor): ?Subscription
{
$qb = $this->entityRepository->createQueryBuilder('s');
$qb
->where('s.subscribingActor = :subscribingActor')
->setParameter('subscribingActor', $subscribingActor->getUser());
// or $subscribingActor->getUser()->getId() to be even more explicit

return $qb->getQuery()->getOneOrNullResult();
}

关于php - DQL 无法通过一对一关系作为参数解析主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61156843/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com