冲洗一对多,自参考


Flush One-To-Many, Self-referencing

我有自引用的一对多关系(我是根据文档:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-对许多自参考)

现在我想将新元素刷新到Entity,但如何使用新元素的ID将其放在引用位置?

我尝试使用:

$newProject->setSubprojectId($newProject);

和:

$newProject->setSubprojectId($newProject->getId());

但我认为在冲洗之前不可能得到物体的ID,我是对的?

我的代码看起来像:

 /**
 * @Route("/project/manage", name="project_edit");
 */
public function registerAction(Request $request)
{
    $user = $this->get('security.token_storage')->getToken()->getUser();
    $newProject = new Project();
    $newProject->setIsActive(1);
    $newProject->setOwner($user);
    $newProject->setCreateDate( new 'DateTime() );
    $newProject->setSubprojectId($newProject);
    $formProject = $this->createForm(AddProject::class, $newProject);
    $formProject->handleRequest($request);
    if($formProject->isSubmitted() && $formProject->isValid()){
        $em = $this->getDoctrine()->getManager();
        $em->persist($newProject);
        $em->flush();
        return $this->render('xxx/projectEdit.html.twig', array(
            'form' => $formProject->createView(),
        ));
    }
    return $this->render('xxx/projectEdit.html.twig', array(
        'form' => $formProject->createView(),
    ));
}

编辑

我找到了不同的解决方案,但问题仍然有效——是否可以在刷新之前获取此id,或者同时刷新两列的id?

您可以尝试设置级联持久化,但为什么不直接这样做呢:

$em = $this->getDoctrine()->getManager();
$em->persist($newProject);
$em->flush();
$newProject->setSubProject($newProject); // *why* do you want to do this?
$em->persist($newProject);
$em->flush();

你不需要直接设置id。您应该能够通过在对象上使用setter来实现这一点,并且原则应该为您处理id。