如何使用DQL通过病理学计算用户

时间:2013-12-21 12:37:42

标签: symfony doctrine-orm

我有一个问题是找到一种替代方法来计算患有病理的用户(带有分组的计数) 问题是我不想在病态上做一个for循环来计算,我想如果我能得到你的建议。 这是我的一些代码:

用户实体:

/**
 * @ORM\OneToMany(targetEntity="Hospitalisation", mappedBy="user")
 */
private $hospitalisations;

住院实体:

/**
 * @ORM\ManyToOne(targetEntity="Pathologie", inversedBy="hospitalisations")
 */
private $pathologie;

病理学实体:

/**
 * @ORM\OneToMany(targetEntity="Hospitalisation", mappedBy="pathologie")
 */
private $hospitalisations;

我要做的是计算数据库中每个病理受害者的数量。 谢谢:))

2 个答案:

答案 0 :(得分:1)

创建自定义存储库类 PathologieRepository

http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

添加此(未测试):

public function countUsers($pathologieID)
{
    $result = $this->getEntityManager()
        ->createQuery("
            SELECT COUNT(u) as c FROM YourMainBundle:Users u
                JOIN u.hospitalisations h
                JOIN h.pathologies p
                WHERE
                    p.id = :pathologie
        ")
        ->setParameter('pathologie', $pathologieID)
        ->setMaxResults(1)
        ->getSingleResult();
    return $result['c'];
}

如果你想在twig中这样做(伪):

for pathologie as p
       print p.countUsers(p.id)

您必须在pathologie实体类中创建一个方法。但是你不能在实体类中使用实体管理器(你可以使用hack但不建议这样做)。所以你必须使用循环来计算用户数。

public function getUserCount()
{
    $hospitalisations = $this->getHospitalisations();
    $counter = 0;

    foreach ($hospitalisations as $h)
    {
        $counter += count($h->getUsers());
    }

    return $counter;
}

答案 1 :(得分:0)

我解决了这个问题。 这是我提出的解决方案:

$result = $this->getEntityManager()
        ->createQuery("
            SELECT p.id, p.nom, COUNT(DISTINCT u) as nbUsers , COUNT(DISTINCT i) as nbImported 
                FROM AcmeDemoBundlePathologie p
                left JOIN p.importedUsers i
                left JOIN p.hospitalisations h
                left JOIN h.user u

                GROUP BY p.id, p.nom
        ")
        ->getArrayResult();