Symfony - 使用学说获取最后一个 ID
Posted
技术标签:
【中文标题】Symfony - 使用学说获取最后一个 ID【英文标题】:Symfony - Get last id with doctrine 【发布时间】:2017-04-19 08:24:05 【问题描述】:我刚刚开发了一个控制器,它包括创建一个能够添加一个或多个问题的主题。 它有效,但我对我的代码质量并不满意:
确实,当我想创建一个新主题时,我无法在 phpmyadmin 中检索表 QUESTION 的最后一个 id。 (我目前有两张表:SUBJECT、QUESTION)
我找到的唯一解决方案,而且非常难看,是创建主题,并在我的 QUESTION 表中创建一条记录,以最终通过 getid() 通过自动增量检索最后一个 id,并在显示表单之前删除相同的问题用于添加问题。
你们有没有更好的解决方案? :(
提前感谢您的回归,
我的代码:
/**
* @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(),
]);
【问题讨论】:
第一步是在自定义存储库中使用 自定义方法。 类似public function findLastQuestion()
然后您可以使用单元测试对其进行测试,以交付您需要的东西。 ..如果你喜欢更简单的结构,你可以使用 queryBuilder ......并删除你的解决方法。
感谢您的回复。让我试试这个! :)
如果另一个用户在您的应用等待第一个用户的响应时提出问题,会发生什么情况。应该不需要下一个可用的问题 ID。特别是如果您使用 Doctrine 实体管理器。
您好,感谢您的反馈。我试图用另一种方式解决我的问题:Cascade persiste 看起来更合适。 symfony.com/doc/current/form/form_collections.html 一个回复让我看起来更好。但是,如果我想整合 3 或 4 个响应,当我在 questiontype 表单上添加“'allow_add' => true”时会出现错误 500。
【参考方案1】:
您无需添加新记录即可获取最后一个 id。 你可以试试这个:
$lastQuestion = $em->getRepository('AppBundle:Question')->findOneBy([], ['id' => 'desc']);
$lastId = $lastQuestion->getId();
获取flush
之后的最后一个id:
$em->persist($question); // Id not avalaible
$em->flush();
$lastId = $question->getId(); // we can now get the Id
【讨论】:
【参考方案2】:只需从您的表中选择并按 id DESC 排序,并限制为 1 条记录。创建新记录只是为了获取最后一个插入 id 太疯狂了!
【讨论】:
是的,我知道... :( 我该怎么做。直接来自我的控制者?来自实体?你有什么建议?大卫 就我个人而言,我使用一个服务类来对我的实体做任何事情,并且该服务类有一个用于任何数据库调用的存储库类。在您的存储库类中,创建一个 findLastRecord() 方法,将查询放在那里。在您的控制器中,我会调用 $question = $service->getRepository()->findLastRecord(); 好的,谢谢。你同意吗? /** * @return 查询 */ public function queryLatest() return $this->getEntityManager() ->createQuery(' SELECT q.id FROM AppBundle:Question q WHERE q.id=LAST_INSERT_ID(); ') ; 不,你没有身份证。 Just SELECT q.id FROM AppBundle:Question q SORT BY q.id DESC LIMIT 1以上是关于Symfony - 使用学说获取最后一个 ID的主要内容,如果未能解决你的问题,请参考以下文章
Symfony2 抛出学说异常“检查与您的 MySQL 服务器版本相对应的手册,以获取在 'group' 附近使用的正确语法”