2017-04-19 8 views
0

방금 ​​하나 이상의 질문을 추가 할 수있는 주제를 만드는 컨트롤러를 개발했습니다. 작동하지만 코드의 품질에 만족하지 않습니다.Symfony - 교리로 마지막 ID를 얻으십시오.

실제로 새 토픽을 만들 때 phpmyadmin에서 내 테이블 QUESTION의 마지막 ID를 검색 할 수 없습니다. (내가 잠시 두 테이블 : 제목, 질문)

내가 찾은 유일한 해결책은, 그리고 아주 못생긴입니다, 주제를 만들고, 마지막 질문을 통해 마지막 ID를 검색하는 내 QUESTION 테이블에 레코드를 만드는 것입니다 autoincrementation에 의해 getid()를 호출하고 같은 질문을 먼저 삭제하십시오. 질문 추가 양식을 표시하십시오.

더 좋은 해결책이 있습니까? :(

는 수익을 위해 미리 감사

내 코드 :. 새 레코드를 생성

/** 
* @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를 사용할 수 있습니다. 해결 방법. – Confidence

+0

응답 해 주셔서 감사합니다. 내가 이것을 시도하자! :) –

+1

그리고 앱이 첫 번째 사용자의 응답을 기다리는 동안 다른 사용자가 질문을하면 어떻게됩니까? 다음으로 사용할 수있는 질문 ID가 필요 없습니다. 특히 Doctrine 엔티티 관리자를 사용하는 경우. – Cerad

답변

0

그냥 아이디 DESC BY 테이블 및 ORDER에서 선택하고 LIMIT 1 개 레코드

+0

예 알아요 :(어떻게 할 수 있습니까? 내 컨트롤러에서 직접 엔티티에서 수신 David –

+0

개인적으로 필자는 내 엔티티와 서비스 클래스를 사용하여 서비스 클래스를 사용합니다. 어떤 db 호출을위한 저장소 클래스를 가지고 있습니다. 저장소 클래스에서 findLastRecord() 메서드를 만들고 거기에 쿼리를 넣으십시오. 컨트롤러에서 $ question = $ service-> getRepository() -> findLastRecord();를 호출합니다. – delboy1978uk

+0

확인 /** * @return 쿼리 */ 공공 기능 queryLatest() { 반환 $ this-> GET?. 감사합니다이 동의 있습니까 EntityManager() -> createQuery (' SELECT q.id FROM AppBundle : 질문 q WHERE q.id = LAST_INSERT_ID(); ') ; } –