我有这个函数duplicateCourseAction,其目标是...复制一个Course对象
public function duplicateCourseAction(Request $request) {
if ($this->getRequest()->isXmlHttpRequest() == false) {
return new Response("Bad request", 405);
}
$em = $this->getDoctrine()->getManager();
$parameters = $request->request->all();
$course = $em->getRepository('EntTimeBundle:Course')->findOneById($parameters['id']);
$duplicate = clone $course;
$duplicate->setDate(new \DateTime($parameters['date']));
$em->persist($duplicate);
$em->flush();
return new Response("200");
}
根据文档,“clone”关键字制作表面副本(即参考副本)。 这显然不是我想要的,因为我的课程实体包含许多与其他实体的关系,我宁愿想要一个值复制。
我发现了unserialize(序列化(对象))技巧:
public function duplicateCourseAction(Request $request) {
if ($this->getRequest()->isXmlHttpRequest() == false) {
return new Response("Bad request", 405);
}
$em = $this->getDoctrine()->getManager();
$parameters = $request->request->all();
$course = $em->getRepository('EntTimeBundle:Course')->findOneById($parameters['id']);
$duplicate = unserialize(serialize($course));
$duplicate->setDate(new \DateTime($parameters['date']));
$em->persist($duplicate);
$em->flush();
return new Response("200");
}
但是我对Doctrine有这个错误:
注意:未定义索引:000000003ed2e9ea00000000ee270fde in /home/mart_q/Diderot/ent/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php第2776行
答案 0 :(得分:0)
这里的诀窍是你必须取消设置重复的实体ID。否则打破了学说的逻辑。教义有一些已知的limitations。另请查看此question,它非常相似。
答案 1 :(得分:0)
您可以通过覆盖__clone()
实体中的Course
方法来控制确切克隆的内容。如果需要深层复制,可以将id
设置为null
并克隆引用的对象。
序列化/反序列化感觉就像一个黑客,所以我建议不要使用它。