如何在Symfony / Doctrine中保留克隆的实体对象

时间:2017-10-24 16:59:49

标签: php symfony doctrine

我正在尝试克隆实体记录及其与其他实体之间的关系。我已成功克隆了一些实体对象,但这种一对多的实体关系对我提出了挑战。我已经审查了类似的问题,即我在没有取得进展的情况下给出的错误信息。

查询正确的记录,循环并克隆然后存储在数组中。我试图坚持数组但得到错误

  

EntityManager#persist()期望参数1是实体对象,   数组给出

然后我尝试对数组进行编码并保持但我收到错误

  

班级' Symfony \ Component \ HttpFoundation \ JsonResponse'不是   在链配置的命名空间NameOfBundle \ Entity。

中找到

以下代码在我的控制器中

    $quoteItemAddWorkCollection = $em->getRepository('UniflyteBundle:QuoteItemAdditionalWork')->findBy($params);
    $quoteItemDeliverableCollection = $em->getRepository('UniflyteBundle:QuoteItemDeliverable')->findBy($params);

    if (!empty($quoteItemAddWorkCollection)) {
        $quoteItemAddWorkArray = [];
        foreach ($quoteItemAddWorkCollection as $quoteItemAddWorkItem) {
            $quoteItemAddWorkItemClone = clone $quoteItemAddWorkItem;
            array_push($quoteItemAddWorkArray, $quoteItemAddWorkItemClone);
        }
        $quoteItemAddWorkCollection = new JsonResponse($quoteItemAddWorkArray);

        $em->persist($quoteItemAddWorkCollection);

我不能坚持一个阵列,我必须首先将它编码为json。我做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为你对这里的学说概念有误解。就学说而言,每个实体:

  • UniflyteBundle:QuoteItemAdditionalWork

  • UniflyteBundle:QuoteItemDeliverable

    及其任何关系都可以使用名为Mapping的配置保持持久性。

要使其生效,任何内存中对象,必须是托管实体类的实例。

在Doctrine中没有这样的魔力,可以同时保留这么多未知物体。你可以在循环中一个接一个地坚持它们:

foreach ($quoteItemAddWorkCollection as $quoteItemAddWorkItem) {

    $quoteItemAddWorkItemClone = clone $quoteItemAddWorkItem;
    $quoteItemAddWorkItemClone->setId(null);

    // Set relationships here ...

    $em->persist($quoteItemAddWorkItemClone);
}

在保留新的克隆对象之前,请记住设置任何所需的关系。

如果你想使用,一个坚持,你可以在循环中分配他们的关系:

foreach ($quoteItemAddWorkCollection as $quoteItemAddWorkItem) {

    $quoteItemAddWorkItemClone = clone $quoteItemAddWorkItem;
    $quoteItemAddWorkItemClone->setId(null);

    $someParentCollection->add($quoteItemAddWorkItemClone);
}

$em->persist($someParentCollection);

后一种方法,需要您在映射配置上设置cascade

class SomeParent
{
    // @ORM\OneToMany(targetEntity="QuoteItemAdditionalWork", mappedBy="parent", cascade={"persist"})
    private $quoteItemAddWork;
}