Php 深度克隆对象:克隆与序列化
我有这个函数,它的目标是。。。复制课程对象Php 深度克隆对象:克隆与序列化,php,symfony,serialization,doctrine-orm,clone,Php,Symfony,Serialization,Doctrine Orm,Clone,我有这个函数,它的目标是。。。复制课程对象 public function duplicateCourseAction(Request $request) { if ($this->getRequest()->isXmlHttpRequest() == false) { return new Response("Bad request", 405); } $em = $this->getDoctrine()->getManager
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");
}
根据文献,“克隆”关键字制作表面副本(即参考副本)。
这显然不是我想要的,因为我的课程实体包含许多与其他实体的关系,我宁愿要一个值副本
我发现了反序列化(序列化(对象))技巧:
但我在教义上有一个错误:
注意:未定义索引:00000000 3ED2E9EA00000000EE270FDE in/home/mart_q/Diderot/ent/vendor/doctrine/orm/lib/doctrine/orm/UnitOfWork.php第2776行这里的技巧是必须取消设置重复的实体id。否则会破坏该原则的逻辑。该学说有一些众所周知的特点。也请检查这一点,它非常类似。您可以通过覆盖
课程
实体中的\uu clone()
方法来控制克隆的内容。如果需要深度复制,可以将id
设置为null
并克隆引用的对象
序列化/非序列化感觉像是一种黑客行为,因此我建议不要使用它。我已经测试过取消设置实体id。要我对克隆或序列化方法执行此操作吗?
$B=clone$a$B->setId(空)代码>我正在执行此操作:公共函数uu clone(){$this->id=null;$this->teachers=clone$this->teachers;}
但我有:FatalErrorException:错误:u clone方法在非对象上调用。这是因为教师是一个ArrayCollection()?很难从您提供的内容中分辨出来。尝试并失败,再尝试,调试,注释掉代码的不同部分,看看失败的是什么。我让你走上了正确的道路,但你需要自己去弄清楚细节。我以前已经测试过克隆,但如果你说这是正确的方法,我会自己去弄清楚到底出了什么问题。谢谢:)
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");
}