Symfony主义峰值记忆很多人检索计数关系

时间:2018-04-05 15:15:55

标签: symfony join doctrine-orm query-builder

我有一个实体Routage和实体联系人。它们与多对多关系相关联。 我在路由实体的存储库中创建了一个函数来检索路由和相关的联系人数量:

public function getRoutages(Revue $Revue)
{
    $qb = $this->createQueryBuilder("Routage")
        ->leftJoin("Routage.contacts", "Contact")
        ->addSelect("Routage")
        ->addSelect("Contact")
        ->andWhere('Routage.revue = :Revue')
        ->setParameter('Revue', $Revue)
    ;
    return $qb->getQuery()->getResult();
}

在我的实体Routage中,我创建了这个来获取联系人的数量:

public function getNbContact(){
    return count($this->getContacts());
}

当我使用Routage.getNbContacts()时,我的峰值内存高达178MB。

你有解决方案吗?

谢谢,

2 个答案:

答案 0 :(得分:1)

是的,这种方法的问题在于你直接使用学说,但是......问题是什么?,水化过程是学说中最重的过程之一,你要求所有的联系人,例如100但是学说必须给每个人保湿,然后才算数。

我建议向存储库询问没有水合作用的数据,并将数据放在数据库上。

例如:

$qb = $this->createQueryBuilder("Routage")
        ->leftJoin("Routage.contacts", "Contact")
        ->addSelect("count(Contact.id)")
        ->addSelect("Routage.id)")
        ->andWhere('Routage.revue = :Revue')
        ->addGroupBy("Routage.id")
        ->setParameter('Revue', $Revue)
    ;
    return $qb->getQuery()->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);

请记住在选择中为每个列添加groupby。

我无法品尝它,所以我觉得我有些不对劲,但这就是我的想法。

希望它有所帮助,

如果需要更多信息告诉我。

答案 1 :(得分:0)

而不是

public function getRoutages(Revue $Revue)
{
    $qb = $this->createQueryBuilder("Routage")
        ->leftJoin("Routage.contacts", "Contact")
        ->addSelect("Routage")
        ->addSelect("Contact")
        ->andWhere('Routage.revue = :Revue')
        ->setParameter('Revue', $Revue)
    ;
    return $qb->getQuery()->getResult();
}

尝试

public function getRoutages(Revue $Revue)
{
    $qb = $this->createQueryBuilder("Routage")
        ->leftJoin("Routage.contacts", "Contact")
        ->andWhere('Routage.revue = :Revue')
        ->setParameter('Revue', $Revue)
    ;
    return $qb->getQuery()->getResult();
}

当你这样做时

$this->createQueryBuilder("Routage")
     ->leftJoin("Routage.contacts", "Contact")

您已经在使用select