在Doctrine2中,无法删除单向多一对一的关系(无法设置为null)



我有一个像用户实体一样工作的身份验证实体,以及具有与身份验证实体相关的属性的国家实体:

/**
 * @var Authentication
 *
 * @ORMManyToOne(targetEntity="Authentication")
 * @ORMJoinColumn(name="`archived_by`", referencedColumnName="id")
 */
private $archivedBy;
/**
 * @param Authentication $archivedBy
 * @return Country
 */
public function setArchivedBy(Authentication $archivedBy = null)
{
    $this->archivedBy = $archivedBy;
    return $this;
}

至于文档,默认情况下,"联接"列是无效的。

当我想将用户设置为侦听器中的属性属性时,它可以按预期工作:

public function preRemove(LifecycleEventArgs $event)
{
    $entity = $event->getObject();
    $entity->setArchivedBy($this->tokenStorage->getToken()->getUser());
    $om = $event->getObjectManager();
    $om->persist($entity);
    $om->flush();
}

但是,当我想将此属性设置为null(想要删除关系)时,它无法正常工作:

$country->setArchivedBy(null);

在Symfony Profiler的Doctrine2调试中,我看到SQL查询不包括" SET Archived_by = null",因此:

UPDATE "country" SET "archived_at" = NULL, "updated_by" = '80fa198a-3216-46cd-aedb-64ce7ff27801', "updated_at" = '2017-08-29 17:11:59+0300' WHERE "id" = '8149132e-2e28-4423-bc72-471751b5fcd3';

因此,问题可能会在学说的内部查询构建器中发生。

当我明确定义nullable = true时,

 * @ORMJoinColumn(name="`archived_by`", referencedColumnName="id", nullable=true)

没有预期的,因为默认情况下它已经发生了任何变化。

在Doctrine2文档中,我找不到任何东西。

我所需要的只是将属性存档设置为null。

详细信息:

  • 我使用PostgreSQL。(在那里归档的列是无效的。)
  • 学说ORM 2.5&学说束1.6

尝试以下:

使用此注释:

@ORMJoinColumn(name="`archived_by`", referencedColumnName="id", nullable=true)

启动到您的命令行:

bin/consone doctrine:schema:update --force

删除缓存并重试以进行此操作:

$country->setArchivedBy(null);

这对我来说很好

很难相信问题是关于学说的限制。

当我删除"列"注释中的引号时,它可以按预期工作;这样,

 * @ORMJoinColumn(name="archived_by", referencedColumnName="id")

而不是

 * @ORMJoinColumn(name="`archived_by`", referencedColumnName="id")

然后,学说会用

产生SQL查询
SET archived_by = NULL

它可以报告为错误,但不是错误。在Doctrine2文档中,可以清楚地指出:

您不能报价加入列名。

因此,删除不必要的行情解决了问题。

最新更新