我有一个像用户实体一样工作的身份验证实体,以及一个与身份验证实体单向相关的属性的国家/地区实体:
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。
详细说明:
答案 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中,明确指出:
您无法引用连接列名称。
因此删除不必要的引号可以解决问题。