0

我是使用 Symfony 的新手,我对结构有点困惑。我使用 queryBuilder 进行了自定义查询,但我真的不知道将这段代码放在哪里。它在控制器内部工作,但我不喜欢在那里与 db 进行交互。所以我想把它放在一个实体存储库中,但它真的很有限,我无法将它用于我的案例。此查询通过连接发出请求并按多列过滤。

那么我可以把这段代码放在哪里呢?

编辑1:

    $repository = $this->getDoctrine()->getRepository('EgCBGEBundle:portfoliohistory_pfh');
    $queryBuilder = $repository->createQueryBuilder('pfh');
    $queryBuilder->innerJoin('pfh.portfolio', 'pfo', \Doctrine\ORM\Query\Expr\Join::WITH, 'pfh.id_pfo = pfo.id_pfo');
    $queryBuilder->where('pfh.scenario = :scenario')
                 ->andWhere('pfh.measure_catalogue = :measureCatalogue')
                 ->andWhere('pfh.portfolio IN ('.$subs.')')
                 ->andWhere('pfh.date = :date')
                 ->setParameter('scenario', $scenario)
                 ->setParameter('measureCatalogue', $type)
                 ->setParameter('date', $date)
                 ->groupBy('pfh.portfolio, pfh.id') // , pfo.id
                 //->orderBy('pfo.id', 'ASC')
                 ->setMaxResults(5);
    return $queryBuilder->getQuery()->getResult();
4

3 回答 3

3

将其添加到您的自定义存储库:http ://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#custom-repositories

Class YourEntityRepository extends EntityRepository
{
   public function findMyQuery($scenario, $type, $date){

     $queryBuilder = $this->createQueryBuilder('pfh');
     $queryBuilder->innerJoin('pfh.portfolio', 'pfo', \Doctrine\ORM\Query\Expr\Join::WITH, 'pfh.id_pfo = pfo.id_pfo');
     $queryBuilder->where('pfh.scenario = :scenario')
             ->andWhere('pfh.measure_catalogue = :measureCatalogue')
             ->andWhere('pfh.portfolio IN ('.$subs.')')
             ->andWhere('pfh.date = :date')
             ->setParameter('scenario', $scenario)
             ->setParameter('measureCatalogue', $type)
             ->setParameter('date', $date)
             ->groupBy('pfh.portfolio, pfh.id') // , pfo.id
             //->orderBy('pfo.id', 'ASC')
             ->setMaxResults(5);
    return $queryBuilder->getQuery()->getResult();

}

并且不要忘记将其包含在您的实体中:

/**
 * @ORM\entity(repositoryClass="My\Bundle\Entity\YourEntityRepository ")
 */

在您的控制器中

$results= $em->getRepository('My\Bundle\Entity\YourEntity')->findMyQuery($scenario, $type, $date);
于 2013-11-13T13:27:35.740 回答
1

你应该把它放在你的存储库中

class YourEntityRepository extends EntityRepository
{
   public function findItWithACustomQuery($some_params){

     $queryBuilder = $this->createQueryBuilder('pfh');
     $queryBuilder->innerJoin('pfh.portfolio', 'pfo', \Doctrine\ORM\Query\Expr\Join::WITH, 'pfh.id_pfo = pfo.id_pfo');
     $queryBuilder->where('pfh.scenario = :scenario')
             ->andWhere('pfh.measure_catalogue = :measureCatalogue')
             ->andWhere('pfh.portfolio IN ('.$subs.')')
             ->andWhere('pfh.date = :date')
             ->setParameter('scenario', $scenario)
             ->setParameter('measureCatalogue', $type)
             ->setParameter('date', $date)
             ->groupBy('pfh.portfolio, pfh.id') // , pfo.id
             //->orderBy('pfo.id', 'ASC')
             ->setMaxResults(5);
    return $queryBuilder->getQuery()->getResult();

}

然后你只需在你的控制器或服务中调用它

$em->getRepository('YourEntityBundle:YourEntity')->findItWithACustomQuery($params);
于 2013-11-13T13:08:05.190 回答
0

QueryBuilder 是 Doctrine 的一部分。您可以在控制器或自定义类中使用它。这是官方文档http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html的一部分

http://www.doctrine-project.org/api/orm/2.4/class-Doctrine.ORM.QueryBuilder.html

还有一个例子:http ://drafts.easybib.com/post/44139111915/taiming-repository-classes-in-doctrine-with-the

于 2013-11-13T13:07:31.547 回答