0

我对如何使用已经存在的查询和控制器创建过滤器(其中包含 KnpPaginator)有些困惑

我在我的 repo 中有一个搜索某些东西的查询,在我的控制器中,两个函数private被调用resultsActionpublic一个被调用offreAction,它们都在一起。

关于如何创建一个简单的过滤器的任何想法?我按照本教程进行操作,但我的查询已经存在于我的存储库中,并且在我应用它时它不起作用。

我的回购

public function getQueryByTypeAndPro($type, User $user, $archive)
{
    return $this->createQueryBuilder("opn")
        ->andWhere("opn.type = :type")
        ->setParameter("type", $type)
        ->andWhere("opn.resellerId = :reseller")
        ->setParameter("reseller", $user->getId())
        ->andWhere("opn.archive = :archive")
        ->setParameter('archive', $archive)
        ->orderBy("opn.dateCreation", "DESC")
        ->getQuery()
    ;
}

我的控制器

private function resultsAction(Request $request, User $user, $type, $archive)
    {
        $em = $this->getDoctrine()->getManager();

        $paginator = $this->get('knp_paginator');

        $qb = $em->getRepository("STUserBundle:Operation")->getQueryByTypeAndPro($type, $user, $archive);

        $results = $paginator->paginate(
            $qb,
            $request->query->get('page',1),
            $request->query->get('limit',50),
            [
                'defaultSortFieldName'      => 'opn.dateCreation',
                'defaultSortDirection' => 'desc'
            ]
        );

        return array("results" => $results, "archive" => $archive);
    }

public function offreAction(Request $request, User $user, $archive = false)
    {
        return $this->resultsAction($request, $user, Operation::OFFRE_COMMERCIALE, $archive);
    }

我应该在我的控制器中创建一个新功能(公共)以使其工作吗?或者我可以直接在 KnpPaginator 所在的 resultsAction 中执行吗?

谢谢

4

2 回答 2

0

我解决了我的问题。这是答案

这是我添加过滤器的查询

public function getQueryByTypeAndPro($type, User $user, $archive, $filter)
{
    return $this->createQueryBuilder("opn")
        ->andWhere("opn.type = :type")
        ->setParameter("type", $type)
        ->andWhere("opn.resellerId = :reseller")
        ->setParameter("reseller", $user->getId())
        ->andWhere("opn.archive = :archive")
        ->setParameter('archive', $archive)
        ->andWhere('opn.vehiculeMarque like :vehiculeMarque')
        ->setParameter('vehiculeMarque', '%' . $filter . '%')
        ->andWhere('opn.id like :id')
        ->setParameter('id', '%' . $filter . '%')
        ->orderBy("opn.dateCreation", "DESC")
        ->getQuery()
    ;
}

这是我在控制器中使用它的方式

$qb = $em->getRepository("STUserBundle:Operation")->getQueryByTypeAndPro($type, $user, $archive, $filter);

这就是我在我看来如何使用它

<form action="" method="get">
         <input name="filter" type="text">
         <button type="submit" class="btn btn-default">Filtrer</button>
</form>

希望有帮助

于 2017-09-18T12:46:44.967 回答
0

您可以使用 findBY 功能,即

$em->getRepository("STUserBundle:Operation")->findBy(array('type'=>type,'resellerId'=>resellerId,'archive'=>archive),array('dateCreation'=>DESC))
于 2017-09-18T09:24:15.157 回答