首页 文章

将实体历史记录/更改作为OneToMany关联附加到实体

提问于
浏览
1

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

Order 班:

<?php

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

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

    // more stuff...
}

OrderEvent 班:

/**
 * @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 documentationpreUpdate 方法不应该用于更改关联 .

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

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

1 回答

  • 1

    我想在这种情况下你可以使用 PostUpdate 事件 . 在这种情况下,您确信 update 动作是成功的,您可以做您想做的事情;将新的 OrderEvent 实例添加到 $events 集合中 .

    编辑

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

    使用此扩展,您可以使用简单的 @annotiation 将实体标记为可记录:

    /**
     * @Entity
     * @Gedmo\Loggable
     */
    class Order
    {
        // Your class definition
    }
    

相关问题