1

我已经搜索过,有很多相同的问题,但没有一个能解决我的问题。

我有一个实体,这是它的代码:

/*
 * @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();
            }
        }
}
4

3 回答 3

0

如果您使用继承 - 例如 @ORM\InheritanceType("SINGLE_TABLE") 您需要在父类中添加 @ORM\MappedSuperclass

于 2013-03-21T12:38:42.407 回答
0

来自官方文档preUpdate

刷新操作不再识别对传递实体的字段的更改,使用传递给事件的计算更改集来修改原始字段值。

如果您有权访问,UnitOfWork也许有一种方法可以像onFlush那样重新计算变更集?

于 2013-03-21T00:03:43.993 回答
-1

PreUpdate 仅在实体发生实际更改时触发。如果您不更改表单中的任何内容,实体将不会发生任何更改,并且不会调用 preUpdate 侦听器。

于 2013-03-24T00:37:11.247 回答