我正在使用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 :(得分: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。
但是,你应该考虑到你现在可能有一个自动递增的主键。我不知道教义是否会让你覆盖它。