首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony 2 OneToMany性能优化

Symfony 2 OneToMany性能优化
EN

Stack Overflow用户
提问于 2016-03-24 14:45:26
回答 1查看 138关注 0票数 0

我在我的网站上发现了一个性能问题。我有一个带有oneToMany关系的实体“购物车”。当我在提供大约2000次查询的视图中调用getter方法时。然后,页面的性能下降很大。

使用OneTMany assoc的实体购物车:

代码语言:javascript
复制
class Cart {
    /**
     * @ORM\OneToMany(targetEntity="Comiti\UserBundle\Entity\Subscription", mappedBy="cart")
     */
    protected $subscriptions;
}

我的实体订阅ManyToOne assoc:

代码语言:javascript
复制
class Subscription {
    /**
     * @ORM\ManyToOne(targetEntity="Comiti\UserBundle\Entity\Cart",inversedBy="subscriptions")
     * @ORM\JoinColumn(name="cart_id", referencedColumnName="id")
     * @JMS\Exclude()
     */
    protected $cart;
}

我的小枝视图调用getSubscriptions()生成了许多数据库请求:

代码语言:javascript
复制
{% for subscription in cart.subscriptions %}

我该怎么做才能得到更好的表演?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-24 15:21:46

您正在经历的问题称为N+1问题。您正在获取一个实体,该实体具有关联,然后再遍历和查询。在您的具体示例中,假设订阅有一定的成本,则在此循环中会发生这种情况:

代码语言:javascript
复制
{% for subscription in cart.subscriptions %}
    {{ subscription.cost }}

考虑到您已经查询了一个购物车,您还没有加载它的所有订阅和属性,这是在循环时发生的。为了解决这个问题,您应该在您的购物车上做一个带有订阅的取接

代码语言:javascript
复制
// in CartRepository
public function findCartWithSubscriptions($cartId)
{
    $qb = $this->createQueryBuilder('c');
    $qb->leftJoin('c.subscriptions', 's')
    ->where("c = :cart")
    ->setParameter("cart", $cartId);

    return $qb->getQuery()->getResult();
}

这将为您添加一个购物车对象,并将其订阅加载到内存中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36202991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档