我已经搜索过了,并且有很多问题都存在同样的问题,但没有一个问题可以解决我的问题。
我有一个实体,这是代码:
/*
* @ORM\HasLifecycleCallbacks
*/
class MyEntity
{
// some preoperties here...
/**
* @ORM\Column(type="text", nullable=true)
* @Assert\MaxLength(limit="500")
*/
private $delivery = null;
/**
* @var $deliveryOn bool
*
* Virtual field used for $delivery property organization
*/
private $deliveryOn = false;
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preSetDelivery()
{
if ($this->deliveryOn == false)
$this->delivery = null;
}
/**
* @ORM\PostLoad()
*/
public function loadDeliveryOn()
{
if ($this->delivery != null)
$this->deliveryOn = true;
}
}
loadDeliveryOn
方法始终完美无缺。但是,当我第一次将实体持久化到数据库时,preSetDelivery
仅解除了 。我希望在对象更新时调用它,但它不起作用。我不知道为什么。
我的编辑控制器:
public function editAction($id)
{
// some code here...
// ...
$request = $this->getRequest();
if ($request->isMethod('POST'))
{
$form->bind($request);
if ($form->isValid())
{
$em->flush();
}
}
}
答案 0 :(得分:0)
关于preUpdate
的官方docs:
对传递实体字段的更改无法识别 刷新操作,使用传递给的计算变更集 用于修改原始字段值的事件。
如果您有UnitOfWork
的访问权限,可能有办法重新计算onFlush中的变更集?
答案 1 :(得分:0)
如果使用继承 - 例如@ORM \ InheritanceType(" SINGLE_TABLE") 你需要在父类
中添加@ORM \ MappedSuperclass答案 2 :(得分:-1)
只有在实体上有实际更改时才会触发PreUpdate。如果您不更改表单中的任何内容,则实体上不会有任何更改,也不会调用preUpdate侦听器。