Symfony2动态queryBuilder

时间:2015-09-03 16:11:16

标签: symfony dynamic doctrine query-builder

我正在创建一个工具,用户可以在其中查看实体中的数据,他们可以在这里选择哪些数据以及他们如何查看记录。

我创建了一个包含两个日期字段(开始和结束)的表单,以及一个与数据计数和实体总和相对应的字段列表。

我的问题是:

如何创建动态QueryBuilder,允许我根据用户想要看到的内容添加字段?

Symfony2 dynamic queryBuilder

编辑

public function reportData($fields, $dateStart, $dateFinish)
{
    $em = $this->getEntityManager()
        ->getRepository('AcmeBundle:Entity');
    $query = $em->createQueryBuilder('e');

    foreach($fields as $field)
    {
        switch($field)
        {
            case 'totalResults':
                $query->setect('SUM(e.id) AS '.$field);
                break;
        }
    }
    $query->addWhere('e.dateStart >= :dateStart');
    $query->addWhere('e.dateFinish <= :dateFinish');
    ...

3 个答案:

答案 0 :(得分:0)

这样的东西?将所有选择查询存储在数组中,然后在测试每个字段后将数组传递给查询构建器。

public function reportData($fields, $dateStart, $dateFinish)
{
    $em = $this->getEntityManager()
        ->getRepository('AcmeBundle:Entity');
    $query = $em->createQueryBuilder('e');

    $select_array = array();

    foreach($fields as $field)
    {
        switch($field)
        {
            case 'totalResults':
                $select_array[] = 'SUM(e.id) AS '.$field;
                break;
        }
    }

    $query->select($select_array);
    $query->addWhere('e.dateStart >= :dateStart');
    $query->addWhere('e.dateFinish <= :dateFinish');
    ....

答案 1 :(得分:0)

基本上,您希望继续添加

  

选择字段

根据条件。 所以,解决方案很简单。

你可以使用,

$queryBuilder->addSelect();

See Doctrine Query Builder Documentation

答案 2 :(得分:0)

我会做一个常规的完整查询,然后将其过滤到非教义对象(dao / dto),然后显示它。

这样您就可以先进行复杂优化的查询,然后根据需要过滤结果,即使它与查询本身无关