2013-03-26 39 views
5

预期我有一个实体Shop和相关实体ShopProduct,以下关系式:学说额外的延迟加载不工作与计

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

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

{{ entity.getProducts().count }} 

但使用Symfony2的探查时看号码和查询的内容,我看到的不是,充分选择发出后,我期望(基于the documentation)。

为每个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 
+0

一些额外的树枝提示:使用'entity.products.count'代替。这将自动搜索获得“产品”属性的最佳方式 – 2013-03-26 19:48:43

+0

这就是我最初尝试的,不幸的是,它会导致相同的#和查询类型以及加载时间。我无法想象这是最好的方法;) – 2013-03-26 19:59:03

+0

@TheRookie你使用的是什么版本的ORM?你可以尝试一下Twig上下文吗? – Ocramius 2013-03-29 12:20:25

回答

3

您没有使用树枝的计数功能,但PHP内部一个这样的。 Twig将逐一执行这些功能(首先调用getProducts以导致所有产品的加载,然后计数)。

{{ entity.getProducts().count }} 

吸气剂自动调用这意味着你可以只输出entity.products并用树枝内部长度过滤器计数结果......但结果是一样的(取所有产品)。

{{ 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 }} 
+0

Hi据我所知,没有直接关联实体和存储库。所以像getProductCount这样的Entity方法不会从存储库findAllAddCount()中得到结果。与树枝一样,你必须为entity.productCount创建扩展。我错过了什么? – d3uter 2017-07-28 15:40:24

10

正好遇到了同样的问题和解决方案是非常简单:

{{ value.getAlerts.count() }}

代替

{{ value.getAlerts.count }}

枝条必须是压倒一切的原则count()方法意味着“额外延迟加载”与它自己实现的一个变种,只是默默地获取所有实体指望他们。

这开启所有预期SELECT *查询到COUNT(*)...

+0

似乎这是Twig应该解决的问题吗?你能报告你的发现吗? – Rvanlaak 2015-09-22 15:43:46