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' 附近使用的正确语法”

如何在学说 ORM Symfony 4.1 中使用 array_agg?

使用连接表返回结果的学说不起作用 Symfony2

Symfony2:学说“找不到驱动程序”

使用学说 2 获取最后一个插入 id?

基于模型实例获取学说结果