学说:通过关系发现了一个新的实体......当试图冲洗时
Doctrine: A new entity was found through the relationship... when trying to flush
一段时间以来,我一直试图找到解决方案,但失败了:当我尝试在 Doctrine 2.3 中坚持一个新实体并随后刷新时,我收到:
CRITICAL: Doctrine\ORM\ORMInvalidArgumentException: A new entity was
found through the relationship 'Task#parentTask' that was not
configured to cascade persist operations for entity
我有一个自引用实体任务,在压缩视图中看起来像这样:
class Task
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue
*/
private $id;
/**
* @ManyToOne(targetEntity="tasks\classes\Task", inversedBy="childTasks", fetch="LAZY")
* @JoinColumn(name="parent", referencedColumnName="id")
*/
private $parentTask;
/**
* @OneToMany(targetEntity="tasks\classes\Task", mappedBy="parentTask", fetch="LAZY")
*/
private $childTasks;
}
基于这个任务,我
现在我正在使用 QueryBuilder 中内置的查询获取任务:
function getTasksCreatedByUser($user)
{
$em = $this->db->getEntityManager();
$qb = $em->createQueryBuilder();
$query = $qb->select("t")
->from("tasks\classes\Task", "t")
->where($qb->expr()->andX(
"t.creator = :creator"
// plus more conditions here
))
->setParameter("creator", $user)
->orderBy("t.id", "DESC")
->getQuery()
;
return $query->getResult();
}
对于这些任务中的每一个,我都创建了一个新任务,将它们引用为 $parentTask(代码缩短):
foreach($tasks as $task) {
$newTask = new \tasks\classes\Task();
$newTask->setParentTask($task);
$db->persist($newTask);
}
class DB
{
public function persist($entity)
{
$this->entityManager->persist($object);
$this->entityManager->flush();
}
}
在我的应用程序的其他部分,相同的模式工作正常,但我找不到区别。
你们中的任何人都可以帮助我理解为什么会抛出异常吗?我通读了十几个引用相同异常的其他线程,通常情况是两个对象之间存在某种关系,但到目前为止都没有持续存在;一个会被持久化,另一个不会,这会抛出异常。不过我看不到这种情况发生在我身上。
感谢任何帮助!
在您的任务中尝试此注释 class。
/**
* @OneToMany(targetEntity="tasks\classes\Task", mappedBy="parentTask", cascade={"persist", "remove"}, fetch="LAZY")
*/
private $childTasks;
我找到了解决问题的方法。我将在这里进行解释,希望有一天这会对其他人有所帮助。
我的应用程序有两部分:一部分是我的 Web 界面的 REST 后端;另一部分是我的 Web 界面。第二部分提供 CLI 操作来执行更长的计算。对于两者,我使用相同的代码实例化一个 Doctrine EntityManager。我将此 EntityManager#1 用于访问数据库的多个模型和助手 类。
但是,由于我忘记了我已经有一个实例这一事实,我在我的 CLI 代码 (EntityManager#2) 中创建了第二个 entityManager 来处理特定于 CLI 的数据库访问。这导致了这种情况:getTasksCreatedByUser() 与 EntityManager#1 一起工作,但是 foreach($tasks as $task) 中的部分与 EntityManager#2.
当我取消第二个实例化时,一切都很顺利。
一段时间以来,我一直试图找到解决方案,但失败了:当我尝试在 Doctrine 2.3 中坚持一个新实体并随后刷新时,我收到:
CRITICAL: Doctrine\ORM\ORMInvalidArgumentException: A new entity was found through the relationship 'Task#parentTask' that was not configured to cascade persist operations for entity
我有一个自引用实体任务,在压缩视图中看起来像这样:
class Task
{
/**
* @Id
* @Column(type="integer")
* @GeneratedValue
*/
private $id;
/**
* @ManyToOne(targetEntity="tasks\classes\Task", inversedBy="childTasks", fetch="LAZY")
* @JoinColumn(name="parent", referencedColumnName="id")
*/
private $parentTask;
/**
* @OneToMany(targetEntity="tasks\classes\Task", mappedBy="parentTask", fetch="LAZY")
*/
private $childTasks;
}
基于这个任务,我 现在我正在使用 QueryBuilder 中内置的查询获取任务:
function getTasksCreatedByUser($user)
{
$em = $this->db->getEntityManager();
$qb = $em->createQueryBuilder();
$query = $qb->select("t")
->from("tasks\classes\Task", "t")
->where($qb->expr()->andX(
"t.creator = :creator"
// plus more conditions here
))
->setParameter("creator", $user)
->orderBy("t.id", "DESC")
->getQuery()
;
return $query->getResult();
}
对于这些任务中的每一个,我都创建了一个新任务,将它们引用为 $parentTask(代码缩短):
foreach($tasks as $task) {
$newTask = new \tasks\classes\Task();
$newTask->setParentTask($task);
$db->persist($newTask);
}
class DB
{
public function persist($entity)
{
$this->entityManager->persist($object);
$this->entityManager->flush();
}
}
在我的应用程序的其他部分,相同的模式工作正常,但我找不到区别。
你们中的任何人都可以帮助我理解为什么会抛出异常吗?我通读了十几个引用相同异常的其他线程,通常情况是两个对象之间存在某种关系,但到目前为止都没有持续存在;一个会被持久化,另一个不会,这会抛出异常。不过我看不到这种情况发生在我身上。
感谢任何帮助!
在您的任务中尝试此注释 class。
/**
* @OneToMany(targetEntity="tasks\classes\Task", mappedBy="parentTask", cascade={"persist", "remove"}, fetch="LAZY")
*/
private $childTasks;
我找到了解决问题的方法。我将在这里进行解释,希望有一天这会对其他人有所帮助。
我的应用程序有两部分:一部分是我的 Web 界面的 REST 后端;另一部分是我的 Web 界面。第二部分提供 CLI 操作来执行更长的计算。对于两者,我使用相同的代码实例化一个 Doctrine EntityManager。我将此 EntityManager#1 用于访问数据库的多个模型和助手 类。
但是,由于我忘记了我已经有一个实例这一事实,我在我的 CLI 代码 (EntityManager#2) 中创建了第二个 entityManager 来处理特定于 CLI 的数据库访问。这导致了这种情况:getTasksCreatedByUser() 与 EntityManager#1 一起工作,但是 foreach($tasks as $task) 中的部分与 EntityManager#2.
当我取消第二个实例化时,一切都很顺利。