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

标签 php doctrine-orm doctrine

我使用一对一的关系作为实体的 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/

相关文章:

php - 将派生字段添加到 Doctrine_Record 子类的最佳方法是什么?

php - 调用未定义的方法 mysqli::execute_query()

php - 如何使用 php 上传到单独的文件服务器?

php - 如何使用 Doctrine 刷新一个实体而不刷新另一个实体?

doctrine-orm - 交响乐与学说 : Optional foreign key

php - Doctrine - 多对多过滤结果

php - 将列值从 Select 查询传递到另一个查询以在 PHP 中插入

php - 在一个查询中计算两个字段的问题

php - EntityType 字段的默认选择选项

java - Symfony(doctrine)数据库与 Java/C/C++ 服务器交互