【问题标题】:Symfony2 - leftjoin - order by - count on rightSymfony2 - leftjoin - 排序 - 向右计数
【发布时间】:2014-06-04 10:54:09
【问题描述】:

我有 3 个实体

  • “Ejuridique”与“onetomany”关系

  • “Project”与“onetomany”关系

  • “照片”

我需要每个“Ejuridique”的列表以及他的第一个项目和第一个项目的第一张照片,就像这样。

ejuridique1 - project1_1 - 照片1

ejuridique2 - project2_1 - photo1

ejuridique3 - project3_1 - 照片1

并且,我想根据“Ejuridique”的项目总数订购此“Ejuridique”列表

ejuridique2 - project2_1 - photo1(共 3 个项目)

ejuridique1 - project1_1 - photo1(共 2 个项目)

ejuridique3 - project3_1 - photo1(共 1 个项目)

所以我必须进行级联leftjoin并根据每个“Ejuridique”的项目计数对结果进行排序

使用 querybuilder,当我在 leftjoins 之后添加计数时收到错误消息。

非常感谢您的帮助。

【问题讨论】:

  • count(pr.id) as count1 有什么问题?使用getScalarResult() 而不是getResult() 可能会更好。如果我理解您的问题,我猜您需要通过 COUNT(DISTINCT(pr.id)) 构建您的查询
  • 错误:“带有键“0,count1”的数组的键'projetcs'不存在“。一些“ejuridiques”没有项目。所以我假设它不能计算不存在的东西?除此之外,kanalkyte 在本机 sql 中执行此操作的建议似乎是一个不错的建议。但是,我目前正忙于阅读文档(即使它似乎不是很明确!)。

标签: symfony count left-join


【解决方案1】:

您需要ResultSetMap。 DB Query Builder 仅在您获得标量(数字)值或实体时才有效。当您想同时检索它们时不起作用(即:在您的情况下为 ejuridique + 项目计数)。

您可以通过以下链接找到更多信息Doctrine Documentation : native SQL

编辑

我从您的问题中使用了您的修订历史来找出您在删除后已经写了什么。流动的代码显然不会工作,但我认为你不能同时获得第一个项目的第一张照片和计数。

public function getProjectCount()
{
    $rsm = new ResultSetMappingBuilder($this->_em);

    $rsm->addRootEntityFromClassMetadata('Foo\BarBundle\Entity\Ejuridique', 'e');
    $rsm->addJoinedEntityFromClassMetadata('Foo\BarBundle\Entity\Projects', 'pr', 'e', 'projets', array('id' => 'projet_id'));
    $rsm->addJoinedEntityFromClassMetadata('Foo\BarBundle\Entity\Photos', 'ph', 'pr', 'photos', array('id' => 'photos_id'));        
    $rsm->addScalarResult('ProjectCount', 'ProjectCount');   

    $sql = 'SELECT e.nom, count(pr.id) as ProjectCount
            FROM ejuridique e 
            INNER JOIN Project pr ON e.id = pr.ejuridique_id
            INNER JOIN Photo ph ON pr.id = ph.projet_id
            WHERE e.id = :eid
            GROUP BY project.id,
            ORDER BY ProjectCount';

    $query = $this->_em->createNativeQuery($sql, $qb);
    $query->setParameter('eid', 535);
    $query->setParameter('position_pr', 1);
    $query->setParameter('position_ph', 1);

    return $ejuridiques = $query->getResult();
}

【讨论】:

  • 我已经通过 ResultSetMap 尝试调整了我的问题。
  • 我设法找到了与您的解决方案有点相似的解决方案,但您的解决方案仍然更好,因为更简单且更简单。完美!
猜你喜欢
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多