学说:通过这种关系找到了一个新实体......当试图冲洗时

时间:2015-10-26 14:35:32

标签: php doctrine-orm doctrine

我一直试图暂时解决这个问题,但是失败了:当我试图在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();

    }
}

在我的应用程序的其他部分,相同的模式工作正常,我找不到有什么区别。

你们任何人都可以帮助我理解抛出异常的原因吗?我读了十几个引用相同异常的其他线程,通常情况是两个对象之间存在某种关系,到目前为止都没有持久化;一个会被持久化,另一个不会,这将抛出异常。我不能在我的情况下看到这种情况。

感谢任何帮助!

2 个答案:

答案 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。

当我拿走第二个实例时,一切都像魅力一样。