2013-11-15 39 views
1

Im使用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 
} 

回答

0

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

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

没有被设置,在你的代码这一点..

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

..你先做个$ NEW_ORDER对象,然后做出一个新的$ NEW_ORDER对象,它是$ backlog_order的克隆。换句话说,新实体\ NewOrder的第一行意味着什么都没有。

您也应该知道,PHP中的克隆关键字会生成浅拷贝。因此,$ new_order中的所有引用仍然是旧订单。即使你会设法以你尝试的方式改变班级,现在的学说不会做插入,而是更新。

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

然而,你也应该考虑你现在可能有一个自动递增的主键。我不知道教义是否会让你重写这个。

+0

伟大的答案。尽管我认为教义自动处理主键。 $ new_order = new Entities \ NewOrder;只是为了表明我试图设置一个新的实体,但显然克隆会创建一个新的克隆类型的对象。 我一直在想,当我写这个问题时,这样做没什么意义。我决定通过另一种方法手动进行复制。我希望setAll()可以工作,但无济于事。 – JackalopeZero

1

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

我建议你到实例,坚持一个新的对象,并用获取/设置是这样的:

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

这是我最后做的不幸的事情。我试图懒惰,找到一个捷径,并希望有人会想出一个聪明的解决方法 – JackalopeZero

+0

不要懒惰=)这是我认为最干净的方式,也是适合软件模式的最佳实践。 – DanFromGermany

相关问题