我有一个像用户实体一样工作的身份验证实体,以及具有与身份验证实体相关的属性的国家实体:
/**
* @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文档中,可以清楚地指出:
您不能报价加入列名。
因此,删除不必要的行情解决了问题。