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

时间:2017-08-29 14:44:51

标签: postgresql doctrine-orm many-to-one

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

DECLARE @myQuery nvarchar(max)
SET @myQuery = 'Select '
if @SearchBy = 'Product Name'
  SET @myQuery= @myQuery + 'count(ss_number) OVER (PARTITION BY ss_number, @SearchBy)'
ELSE
  .... --put here your second case
END

SET @myQuery= @myQuery + 'FROM ... WHERE ...'
EXECUTE spexecute_sql @myQuery

至于文档,连接列默认为可为空。

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

/**
 * @var Authentication
 *
 * @ORM\ManyToOne(targetEntity="Authentication")
 * @ORM\JoinColumn(name="`archived_by`", referencedColumnName="id")
 */
private $archivedBy;

/**
 * @param Authentication $archivedBy
 * @return Country
 */
public function setArchivedBy(Authentication $archivedBy = null)
{
    $this->archivedBy = $archivedBy;

    return $this;
}

但是当我想在其控制器中将此属性设置为null(想要删除关系)时,它无法按预期工作:

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

    $om = $event->getObjectManager();
    $om->persist($entity);
    $om->flush();
}

在Symfony profiler的Doctrine2调试中,我看到sql查询不包含“SET archived_by = null”,这样:

$country->setArchivedBy(null);

因此,Doctrine的内部查询构建器中可能会出现此问题。

当我明确定义nullable = true时,

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';

没有任何改变,正如预期的那样,因为它已经是默认的。

Doctrine2 documentation中,我找不到任何内容。

我只需要将archivedBy属性设置为null。

详细说明:

  • 我使用postgresql。 (archived_by列在那里可以为空。)
  • Doctrine ORM 2.5& Doctrine Bundle 1.6

2 个答案:

答案 0 :(得分:0)

试试这个:

使用此注释:

@ORM\JoinColumn(name="`archived_by`", referencedColumnName="id", nullable=true)

启动到命令行后:

bin/consone doctrine:schema:update --force

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

$country->setArchivedBy(null);

这对我来说很好用

答案 1 :(得分:0)

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

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

 * @ORM\JoinColumn(name="archived_by", referencedColumnName="id")

而不是

 * @ORM\JoinColumn(name="`archived_by`", referencedColumnName="id")

然后Doctrine使用

生成SQL查询
SET archived_by = NULL

可能会报告为错误,但它不是错误。在Doctrine2 documentation中,明确指出:

  

您无法引用连接列名称。

因此删除不必要的引号可以解决问题。