是否可以更改Doctrine对象的类?

时间:2013-11-15 12:02:50

标签: php model doctrine entities

我正在使用Doctrine,我需要克隆一个对象。

数据库中的两个表具有相同的列,但是一个表用于积压订单,而一个表是已确认的订单。可能不是最好的方法,但它们必须是分开的,因为在积压对象上无法满足某些外键。

因此,我需要从积压中克隆一个对象并将其插入当前订单表中。但是如果我克隆积压订单对象,它会将类设置为积压订单。

$backlog_orders = $this->Subscription_model->getBacklogOrders();
foreach($backlog_orders as $backlog_order){
    $new_order = new Entities\NewOrder;
    $new_order = clone $backlog_order;
    //Do other stuff to new order
    //At this point, I need to change the class of the object to NewOrder so that it will insert it into the correct table
    echo get_class($order); // Outputs BacklogOrder
    $this->Subscription_model->updateOrder($order); // Saves to DB
}

2 个答案:

答案 0 :(得分:1)

我不能给你一个特定的答案但是如果你克隆了这个对象,你还克隆了它的实体的主键(order_id?),我怀疑Doctrine可以很好地处理这个问题。

我建议你实例并持久保存一个新对象并使用get / set,如下所示:

$new_order = new Entities\NewOrder;
$new_order->setCustomer($backlog_order->getCutomer());

答案 1 :(得分:0)

首先,我想在你的问题中指出一个错误,这可以解释为什么你会遇到这个错误。

  

“但是如果我克隆积压订单对象,它会将类设置为积压订单。”

在代码的这一点上没有设置任何东西..

$new_order = new Entities\NewOrder;
$new_order = clone $backlog_order;

..你首先创建一个$ new_order对象然后创建一个新的$ new_order对象,它是$ backlog_order的克隆。换句话说, new Entities \ NewOrder 的第一行绝对没有任何意义。

您还应该知道PHP中的 clone 关键字是一个浅层副本。所以$ new_order中的所有引用仍然是旧订单。即使您设法以您现在尝试的方式更改类,但是doctrine不会执行插入而是更新。

你基本上想要的是制作一个真正的副本,这是PHP不提供的,因为它会违反类型系统。为了做到这一点,你应该用$ backlog_order中的所有数据填充$ new_order。

但是,你应该考虑到你现在可能有一个自动递增的主键。我不知道教义是否会让你覆盖它。