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");
}