2017-04-19 86 views
0

我刚刚开发了一个控制器,其中包括创建一个主题,添加一个或多个问题的能力。 它的工作原理,但我不是很满意我的代码的质量:Symfony - 获得最后一个id与教条

事实上,当我想创建一个新的主题,我无法检索我的表问题在phpmyadmin的最后一个ID。 (我目前有两张表:SUBJECT,问题)

唯一的解决方案,我发现,它是非常丑陋的,是创建主题,并创建一个记录在我的QUESTION表最终检索最后一个ID通过getid()通过autoincrementation删除并删除相同的问题显示用于添加问题的表单。

你们有没有更好的解决方案? :(

预先感谢您为您的回报,

我的代码:

/** 
* @Route("/add_sujet", name="add_sujet") 
* @Method({"GET", "POST"}) 
*/ 
public function add_sujetAction(Request $request) 
{ 

$sujet = new Sujet(); 

$form = $this->createForm(SujetType::class, $sujet) 
    ->add('saveAndNext', SubmitType::class); 
$form->handleRequest($request); 


if ($form->isSubmitted() && $form->isValid()) { 
    $sujet->setSlug($this->get('slugger')->slugify($sujet->getTitle())); 
    $entityManager = $this->getDoctrine()->getManager(); 
    $entityManager->persist($sujet); 
    $entityManager->flush(); 

    $this->addFlash('success', 'sujet.created_successfully'); 

    if ($form->get('saveAndNext')->isClicked()) { 
     // On commence à créer les questions. 

     $question = new question(); 
     $question->setContent('init'); 
     $question->setType('init'); 
     $question->setSujet($sujet); 
     $entityManager = $this->getDoctrine()->getManager(); 
     $entityManager->persist($question); 
     $entityManager->flush(); // Add factice question<br> 
     $id = $question->getId()+1; // NOT OPTIMIZED.. <br> 
     $entityManager->remove($question); 
<br> 
     $entityManager->flush(); // JE SAIS C'EST TRES MOCHE.. <br> 

     return $this->redirectToRoute('add_question', ['sujetSlug' => $sujet->getSlug(), 'id' => $id]); 

    } 
    // On annule la création de sujet. 
    return $this->redirectToRoute('sujet'); 
} 
// On présente le formulaire pour déclaration sujet. 
return $this->render('default/add_sujet.html.twig', [ 
    'sujet' => $sujet, 
    'form' => $form->createView(), 
]); 

} 
+0

第一步是在自定义仓库中寻找*自定义方法*类似于'public function findLastQuestion()'然后您可以使用单元测试来测试它,你需要....你可以使用queryBuilder,如果你喜欢更简单的结构....和remov您的解决方法。 – Confidence

+0

感谢你的回应。让我试试这个! :) –

+1

如果另一个用户在您的应用等待第一位用户的响应时创建问题会发生什么情况。应该不需要下一个可用的问题ID。特别是如果你使用Doctrine实体管理器。 – Cerad

回答

0

从你的桌子和ORDER BY的ID DESC只需选择,并将其限制为1点的记录创建一个新的记录。只是为了得到最后一个插入ID是疯狂的!

+0

是的,我知道... :(我该怎么做,直接从我的控制器?从实体? 您的建议是什么? 大卫 –

+0

个人而言,我使用服务类来处理我的实体,服务类在你的仓库类中,创建一个findLastRecord()方法,把查询放在那里。在你的控制器中,我会调用$ question = $ service-> getRepository() - > findLastRecord(); – delboy1978uk

+0

好的谢谢你。你同意这种说法? /** * @返回查询 */ 公共职能queryLatest(){ 回报 $这个 - > GET EntityManager() - > createQuery(' SELECT q.id FROM AppBundle:Question q WHERE q.id = LAST_INSERT_ID(); ') ; } –