我该如何解决这个问题“Symfony 5.4:参数太少:查询定义了 2 个参数,但您只绑定了 1 个”?
P粉715304239
P粉715304239 2023-09-02 12:53:54
[PHP讨论组]

我想加载所有要在“付款”(Bordereaus) 中支付的“实习生”(Stagiaires)。我想通过选择日期间隔并通过它们传递实习生的属性来仅选择那些实习在日期间隔内结束。

“Interns”和“Payment”没有关系,但有一个表“Interns_Payment”(Bordereau_stagiaire) 链接到这两个表。我想通过存储库来完成此操作,然后将其加载到我的 PaymentController 的“编辑”中。我是 symfnony 新手

我在我的 Payment(Bordereau)Repository 中编写了此查询

    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()
        ;
        
    }

这是我控制器中的付款(Bordereau)编辑功能

    #[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,
        ]);
    }

我本来希望通过检查 dd($bordereauRepository); 来获得结果,但我却得到了这个结果。

我搜索过有关“查询中的参数太少”的类似问题,但未能成功找到解决方案。

编辑

我添加了dateDebut和dateFin的setParamaters。但我无法访问它。

我应该创建一个自定义形式的 bordereau 吗?

编辑2

这是我的新 DQL 函数

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()
        ;
        
    }

它使用我设置的静态参数打印结果。但对于动态的则不然。

我还创建了一个模型 BordereauEditModel 和一个来自 BordereauEditType 的自定义表单

这是我在 BordereauController 中的edit 函数

    #[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,
        ]);
    }

当我尝试加载动态的时,它显示“在 null 上调用成员函数 format()”。我不知道这是否是另一个问题,我应该从这里删除它(即作为主帖中的一个段落,这样人们就不会感到困惑)

在 null 上调用成员函数 format() -> 已解决

P粉715304239
P粉715304239

全部回复(1)
P粉394812277

从条件中删除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()
    ;
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号