Php 将实体历史记录/更改作为OneToMany关联附加到实体
我有一个实体Php 将实体历史记录/更改作为OneToMany关联附加到实体,php,doctrine-orm,zend-framework2,one-to-many,Php,Doctrine Orm,Zend Framework2,One To Many,我有一个实体Order,它有一个属性events,其中应该包含对该实体所做的所有更改的列表 订单类: <?php /** * @ORM\Entity */ class Order { // more stuff... /** * @ORM\OneToMany( * targetEntity="OrderEvent", * mappedBy="order", * cascade={"persist"
Order
,它有一个属性events
,其中应该包含对该实体所做的所有更改的列表
订单
类:
<?php
/**
* @ORM\Entity
*/
class Order
{
// more stuff...
/**
* @ORM\OneToMany(
* targetEntity="OrderEvent",
* mappedBy="order",
* cascade={"persist", "merge"}
* )
*/
protected $events;
// more stuff...
}
/**
* @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;
}
}
}
但是,不应使用preUpdate
方法来更改关联
像这样做的推荐方法是什么
我使用的是Zend Framework 2,但我认为这与此无关。我认为在这种情况下,您可以使用
PostUpdate
事件。在这种情况下,您可以确定更新
操作成功,并且可以做您想做的事情;将新的OrderEvent
实例添加到$events
集合中
编辑
你不是第一个实现这种事情的人。也许你应该检查现有的例子,看看它们是如何处理的(或者甚至考虑使用它)。比如说 使用此扩展,您可以使用简单的注释将实体标记为可记录:
/**
* @Entity
* @Gedmo\Loggable
*/
class Order
{
// Your class definition
}
问题是,在
postapdate
上没有可用的更改信息。你会怎么处理?我的第一个想法是将更改存储在(可能是静态的)类属性中。但这似乎不是很好!?你不是第一个实现这种事情的人。也许你应该检查现有的例子,看看他们是如何处理这个问题的。例如,现在唯一缺少的是OneToMany
关联,就像我的例子orderItems
。我希望在订单历史记录中包含orderItems的更改。但是我想我会改变我现有的代码,分别使用orderItem历史记录。非常感谢。