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

42fyovps  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(124)

我想加载所有要在'Payment'(Bordereaus)中支付的'Interns'(Stagiaires)。我想通过选择日期间隔并通过它们传递Interns的属性来选择仅在日期间隔中实习结束的实习生。
'Interns'和'Payment'没有关系,但有一个表'Interns_Payment'(Bordereau_stagiaire)链接到这两个表。我想通过存储库来完成它,然后在PaymentController的“编辑”中加载它。我是新来的symfnony
我在我的支付(Bordereau)存储库中编写了此查询

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?

EDIT2

这是我的新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'。我不知道这是不是另一个问题,我应该把它从这里删除(即作为一个段落在主要职位,使人们不会感到困惑)
在null -> Solved上调用成员函数format()

fdbelqdn

fdbelqdn1#

从条件中取出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()
    ;
}

相关问题