首页  >  问答  >  正文

我该如何解决这个问题“Symfony 5.4:参数太少:查询定义了 2 个参数,但您只绑定了 1 个”?

<p>我想加载所有要在“付款”(Bordereaus) 中支付的“实习生”(Stagiaires)。我想通过选择日期间隔并通过它们传递实习生的属性来仅选择那些实习在日期间隔内结束。</p><p> “Interns”和“Payment”没有关系,但有一个表“Interns_Payment”(Bordereau_stagiaire) 链接到这两个表。我想通过存储库来完成此操作,然后将其加载到我的 PaymentController 的“编辑”中。我是 symfnony 新手</p> <p>我在我的 Payment(Bordereau)Repository 中编写了此查询</p> <pre class="brush:php;toolbar:false;"> public function findByDate(Bordereau $bordereau){ $query = $this->createQueryBuilder('bo'); return $query->select('bo', 'bord_stag', 'st') ->leftJoin('bo.bordereauStagiaire', 'bord_stag') ->leftJoin('bord_stag.stagiaire', 'st') ->andWhere('st.finStage >= IN(:dateDebut)') ->andWhere('st.finStage <= IN(:dateFin)') ->andWhere('st.isDeleted = IN(:delete)') ->setParameter('delete', false) ->setParameter('dateFin', $bordereau->dateFin) ->setParameter('dateDebut', $bordereau->dateDebut) ->getQuery() ->getResult() ; } </pre> <p>这是我控制器中的付款(Bordereau)编辑功能</p> <pre class="brush:php;toolbar:false;"> #[Route('/{id}/edit', name: 'app_bordereau_edit', methods: ['GET', 'POST'])] public function edit(Request $request, Bordereau $bordereau, BordereauRepository $bordereauRepo): Response { $formBordereau = $this->createForm(BordereauEditType::class, $bordereau); $formBordereau->handleRequest($request); if ($formBordereau->isSubmitted() && $formBordereau->isValid()) { $bordereauRepo->save($bordereau, true); dd($bordereau); return $this->redirectToRoute('app_bordereau_index', [], Response::HTTP_SEE_OTHER); } return $this->renderForm('bordereau/edit.html.twig', [ 'bordereau' => $bordereau, 'form' => $formBordereau, ]); } </pre> <p>我本来希望通过检查 <code>dd($bordereauRepository);</code> 来获得结果,但我却得到了这个结果。</p> <p>我搜索过有关“查询中的参数太少”的类似问题,但未能成功找到解决方案。</p> <p><strong>编辑</strong></p> <p>我添加了dateDebut和dateFin的setParamaters。但我无法访问它。</p> <p>我应该创建一个自定义形式的 bordereau 吗?</p> <p><strong>编辑2</strong></p> <p>这是我的新 DQL 函数</p> <pre class="brush:php;toolbar:false;">public function findByDate(BordereauEditModel $bordereau, bool $isDeleted = false){ $query = $this->createQueryBuilder('bo'); $query ->select('bo', 'bord_stag', 'st') ->leftJoin('bo.bordereauStagiaire', 'bord_stag') ->leftJoin('bord_stag.stagiaire', 'st') ->andWhere('st.isDeleted = :delete') ->setParameter('delete', $isDeleted); if ($bordereau->dateDebut) { $query->andWhere('st.finStage <= :dateDebut') ->setParameter('dateDebut', $bordereau->dateDebut->format('Y-m-d')); } if ($bordereau->dateFin) { $query->andWhere('st.finStage <= :dateFin') ->setParameter('dateFin', $bordereau->dateFin->format('Y-m-d')); } $query ->getQuery() ->getResult() ; } </pre> <p>它使用我设置的静态参数打印结果。但对于动态的则不然。</p> <p>我还创建了一个模型 <code>BordereauEditModel</code> 和一个来自 <code>BordereauEditType</code> 的自定义表单</p> <p>这是我在 <code>BordereauController</code> 中的<code>edit</code> 函数</p> <pre class="brush:php;toolbar:false;"> #[Route('/{id}/edit', name: 'app_bordereau_edit', methods: ['GET', 'POST'])] public function edit(Request $request, Bordereau $bordereau, BordereauRepository $bordereauRepository, BordereauEditModel $bordereauEdit): Response { $bordereauEdit = new BordereauEditModel(); $formBordereau = $this->createForm(BordereauEditType::class, $bordereauEdit); $formBordereau->handleRequest($request); if ($formBordereau->isSubmitted() && $formBordereau->isValid()) { $bordereauRepository->findByDate($bordereauEdit); $bordereauRepository->save($bordereau, true); dd($bordereauRepository); return $this->redirectToRoute('app_bordereau_index', [], Response::HTTP_SEE_OTHER); } return $this->renderForm('bordereau/edit.html.twig', [ 'bordereau' => $bordereau, 'form' => $formBordereau, ]); } </pre> <p>当我尝试加载动态的时,它显示“在 null 上调用成员函数 format()”。我不知道这是否是另一个问题,我应该从这里删除它(即作为主帖中的一个段落,这样人们就不会感到困惑)</p> <p>在 null 上调用成员函数 format() -> 已解决</p>
P粉715304239P粉715304239412 天前634

全部回复(1)我来回复

  • P粉394812277

    P粉3948122772023-09-03 10:09:17

    从条件中删除IN。如果要使用IN进行检查,则不能使用比较运算符。

    public function findByDate(Bordereau $bordereau){
       $query = $this->createQueryBuilder('bo');
    
       return $query->select('bo', 'bord_stag', 'st')
        ->leftJoin('bo.bordereauStagiaire', 'bord_stag')
        ->leftJoin('bord_stag.stagiaire', 'st')
        ->andWhere('st.finStage >= :dateDebut')
        ->andWhere('st.finStage <= :dateFin')
        ->andWhere('st.isDeleted = :delete')
        ->setParameter('delete', false)
        ->setParameter('dateFin', $bordereau->dateFin)
        ->setParameter('dateDebut', $bordereau->dateDebut)
        ->getQuery()
        ->getResult()
        ;
    }
    

    回复
    0
  • 取消回复