8

我有一个实体Shop和一个相关实体ShopProduct,具有以下关系:

/**
 * @ORM\OneToMany(targetEntity="ShopProduct", mappedBy="shopid", fetch="EXTRA_LAZY")
 */
private $products;

在树枝模板中,我想访问的计数products所以我访问

{{ entity.getProducts().count }}

但是当使用 symfony2 探查器查看查询的数量和内容时,我看到发出了一个完整的选择,而不是COUNT我所期望的(基于文档)。

为每个 s 发出完全选择会Shop导致 250Mb+ 的内存使用和 30+ 秒的页面加载时间,这是不希望的。

添加后,fetch="EXTRA_LAZY"我已经清除了学说缓存。

我是否忽略了某些东西,使用了错误的方法或误解了文档?

[编辑]

doctrine/annotations                v1.1
doctrine/cache                      v1.0
doctrine/collections                v1.1
doctrine/common                     2.4.0-RC1
doctrine/data-fixtures              dev-master eef10f6
doctrine/dbal                       2.3.3
doctrine/doctrine-bundle            v1.2.0-beta1
doctrine/doctrine-fixtures-bundle   dev-master 275540d
doctrine/doctrine-migrations-bundle dev-master 99c0192
doctrine/inflector                  v1.0
doctrine/lexer                      v1.0
doctrine/migrations                 dev-master e1f6efc
doctrine/orm                        2.3.3
4

2 回答 2

14

刚遇到同样的问题,解决方法很简单:

{{ value.getAlerts.count() }}

代替

{{ value.getAlerts.count }}

Twig 必须使用count()它自己的实现的变体来覆盖旨在“额外延迟加载”的 Doctrine 方法,该变体只是愚蠢地获取所有实体来计算它们。

这将所有预期的 SELECT * 查询变成了 COUNT(*)...

于 2014-05-14T20:22:23.773 回答
3

您没有使用树枝的计数功能,而是像这样的 php 内部功能。Twig 将一个一个地执行函数(首先调用 getProducts 导致所有产品的加载,然后 count )。

{{ entity.getProducts().count }}

getter 被自动调用,这意味着您可以只输出 entity.products 并使用 twigs 内部长度过滤器来计算结果……但结果是相同的(获取所有产品)。

{{ entity.products|length }}

您真正需要的是一种设置 ShopRepository 提供的 Shop 实体计数的方法。

public function findAllAddCount()
{
    $qb = $this->createQueryBuilder('s');
    $query = $qb
        ->set('s.productCount', $qb->expr()->count('s.products'))
        ->getQuery()
   ;

   return $query->getResult();
}

...并将其添加到您的实体中:

protected $productCount;

public function getProductCount()
{
   return $this->productCount;
}

public function setProductCount($count)
{
    $this->productCount = $count;

    return $this;
}

然后像这样在树枝中输出产品数量:

{{ entity.productCount }}
于 2013-05-23T18:31:32.250 回答