将实体 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
}
我有一个实体 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
}