我是使用Symfony的新手,我对结构有点困惑。我使用queryBuilder进行了自定义查询,但我真的不知道在哪里放这段代码。它在控制器内部工作,但我不喜欢与db进行交互。所以我虽然把它放在一个实体存储库中,但它确实有限,我无法将它用于我的情况。此查询通过多列生成加入和过滤的请求。
那我可以把这段代码放在哪里?
EDIT1:
$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();
答案 0 :(得分: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);
答案 1 :(得分: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);
答案 2 :(得分: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