2017-04-19 81 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(); ') ; } –