我正在尝试克隆实体记录及其与其他实体之间的关系。我已成功克隆了一些实体对象,但这种一对多的实体关系对我提出了挑战。我已经审查了类似的问题,即我在没有取得进展的情况下给出的错误信息。
查询正确的记录,循环并克隆然后存储在数组中。我试图坚持数组但得到错误
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。我做错了什么?
答案 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;
}