在flush()Symfony3之后立即获取自动生成的ID

时间:2017-06-29 18:41:18

标签: php symfony doctrine

我有一个Project实体,在创建新项目时,我需要能够上传文件。出于这个原因,我创建了Files实体,它保存了路径和projectID。我的问题是我不知道如何在创建后检索它。这是我想要做的事情

 $projectService->createProject($project,$user,$isWithoutTerm,self::NO_TERM_DEFAULT_VALUE);
            $filesService = $this->get('app.service.files_service');
            foreach ($managerFiles as $managerFile){
                $fileName = $filesService->uploadFileAndReturnName($managerFile);
                $filesService->createFile($fileName,$project->getId(),$user);
            }

目前我的$project没有ID,这意味着我无法创建新文件。我听说我可以使用$ em-> retrieve(object),但实际的刷新不是在控制器中完成的。如果我尝试在我的createProject函数中使用它并因某些原因返回它我不能。 PHPStorm说这是一个无效功能。以下是createProject

中的代码
        $project->setFromUser($user->getFullName());
        $project->setDepartment($user->getDepartment());
        $project->setIsOver(false);
        $project->setDate(new \DateTime());
        if($isWithoutTerm){
            $project->setTerm(\DateTime::createFromFormat('Y-m-d', $noTermDefaultValue));
        }
        $this->entityManager->persist($project);
        $this->entityManager->flush();

有没有办法在刷新后检索projectID并且能够在我的控制器中使用它?

2 个答案:

答案 0 :(得分:1)

这可能是一个竞争条件,其中$项目尚未可用,因此服务无法加载它,因此getId()失败。

首先,创建项目实体:

//build your $project
$this->entityManager->flush();  

其次,将此$项目发送到您的"服务"

$projectService->createProject($project,$user,$isWithoutTerm,self::NO_TERM_DEFAULT_VALUE);
$filesService = $this->get('app.service.files_service');
foreach ($managerFiles as $managerFile){
    $fileName = $filesService->uploadFileAndReturnName($managerFile);
    $filesService->createFile($fileName,$project->getId(),$user);
}

更具体地说,如果你将它包装在try / catch中,你可以确切地确定发生了什么:

try {

    $project = new Project();
    //build project
    $this->entityManager->flush();

    //load $projectService..

    $projectService->createProject($project,$user,$isWithoutTerm,self::NO_TERM_DEFAULT_VALUE);
    $filesService = $this->get('app.service.files_service');
    foreach ($managerFiles as $managerFile){
        $fileName = $filesService->uploadFileAndReturnName($managerFile);
        $filesService->createFile($fileName,$project->getId(),$user);
    }

}
catch(\Exception $e) {

    //$e->getMessage() will tell you if you're good to go, or if there
    //is actually an issue

}

但是,它也可能像PHPStorm一样简单,无法反省您的getId()方法,因此无法理解它。或getId()实际上并没有返回id。

答案 1 :(得分:0)

从3.2和3.3升级Symfony解决了这个问题。我不认为这是由于版本本身,而是删除了被删除的东西,改变了很多东西,修改了它。