【问题标题】:Symfony2 dynamic queryBuilderSymfony2 动态查询生成器
【发布时间】:2015-09-03 16:11:16
【问题描述】:

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

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

我的问题是:

如何创建动态 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');
    ...

【问题讨论】:

  • 这是为表单生成器而不是为 queryBuilder :(
  • 是的,确实如此。我的错 !您可以将一系列选项传递给您的实体存储库吗?
  • 是的,我将在 entityRepo 中的函数添加到原始消息中
  • 这只是一个想法,但我认为这不是最好的方法。

标签: symfony dynamic doctrine query-builder


【解决方案1】:

这样的?您将所有选择查询存储在一个数组中,然后在测试每个字段后将该数组传递给查询生成器。

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');
    ....

【讨论】:

  • 嗯,不,这和我做的一样,只是在选择 addSelect $query-&gt;addSelect('SUM(d.id)');
  • 我需要知道这是否是获取过滤记录的最佳方法还是有更标准的方法
  • 我个人的方法和你一样,我没有看到任何其他方法。
  • 非常感谢,我会尝试通过这种方式做或等待更多的想法 :) 感谢您的宝贵时间!
  • 我认为您的意思是 andWhere 而不是 addWhere
【解决方案2】:

基本上,你想继续添加

选择字段

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

你可以使用,

$queryBuilder->addSelect();

See Doctrine Query Builder Documentation

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-05
      • 2020-02-12
      • 2013-03-23
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      相关资源
      最近更新 更多