Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将实体历史记录/更改作为OneToMany关联附加到实体_Php_Doctrine Orm_Zend Framework2_One To Many - Fatal编程技术网

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历史记录。非常感谢。