我一直试图暂时解决这个问题,但是失败了:当我试图在Doctrine 2.3中坚持一个新实体并在之后冲洗时,我收到了:
CRITICAL:Doctrine \ ORM \ ORMInvalidArgumentException:一个新实体 通过关系'Task#parentTask'找到的并非如此 配置为级联实体的持久化操作
我有一个自引用实体Task,它看起来像是一个简洁的视图 - 就像这样:
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();
}
}
在我的应用程序的其他部分,相同的模式工作正常,我找不到有什么区别。
你们任何人都可以帮助我理解抛出异常的原因吗?我读了十几个引用相同异常的其他线程,通常情况是两个对象之间存在某种关系,到目前为止都没有持久化;一个会被持久化,另一个不会,这将抛出异常。我不能在我的情况下看到这种情况。
感谢任何帮助!
答案 0 :(得分:0)
在Task类中尝试此注释。
/**
* @OneToMany(targetEntity="tasks\classes\Task", mappedBy="parentTask", cascade={"persist", "remove"}, fetch="LAZY")
*/
private $childTasks;
答案 1 :(得分:0)
我找到了解决问题的方法。我会在这里解释一下,希望有一天能帮助别人。
我的应用程序有两部分:一部分是我的Web界面的REST后端;第二部分提供CLI操作以执行更长的计算。对于两者,我使用相同的代码实例化Doctrine EntityManager。我将此EntityManager#1用于访问数据库的多个模型和帮助程序类。
但是,由于我忘记了已经有实例的事实,我在我的CLI代码(EntityManager#2)中创建了第二个entityManager,它处理特定于CLI的数据库访问。这导致了这种情况:getTasksCreatedByUser()使用EntityManager#1,但foreach中的部分($ tasks为$ task)使用EntityManager#2。
当我拿走第二个实例时,一切都像魅力一样。