将实体 history/changes 作为 OneToMany 关联附加到实体

Attach entity history/changes to the entity as OneToMany association

我有一个实体 Order,其中 属性 events 应该包含对该实体所做的所有更改的列表。

Order class:

<?php

/**
 * @ORM\Entity
 */
class Order
{
    // more stuff...

    /**
     * @ORM\OneToMany(
     *      targetEntity="OrderEvent",
     *      mappedBy="order",
     *      cascade={"persist", "merge"}
     * )
     */
    protected $events;

    // more stuff...
}

OrderEvent class:

/**
 * @ORM\Entity
 */
class OrderEvent
{
    // more stuff...

    /**
     * @ORM\ManyToOne(targetEntity="Order", inversedBy="events")
     * @ORM\JoinColumn(nullable=false)
     */
    protected $order;

    // more stuff...
}


class OrderLifecycle
{
    public function preUpdate(Order $order, PreUpdateEventArgs $args)
    {
        $changes = $args->getEntityChangeSet();

        if (!empty($changes)) {

            $event = new OrderEvent();

            $event->setOrder($order)
                ->setChanges($changes);

            $order->addEvent($event);

            return $event;
        }
    }
}

但是according to the doctrine documentation,不应该使用preUpdate方法来改变关联。

做这件事的推荐方法是什么?

我正在使用 Zend Framework 2,但我认为这不相关。

我认为在这种情况下您可以使用 PostUpdate 事件。在这种情况下,您确定 update 操作成功并且您可以做您想做的事;将新的 OrderEvent 实例添加到您的 $events 集合中。

编辑

你不是第一个实现这种东西的人。也许你应该检查现有的例子,看看他们是如何处理这个问题的(或者甚至考虑使用它)。例如 the Gedmo Loggable solution.

使用此扩展程序,您可以使用简单的 @annotiation:

将实体标记为可记录
/**
 * @Entity
 * @Gedmo\Loggable
 */
class Order
{
    // Your class definition
}