我在我的网站上发现了一个性能问题。我有一个带有oneToMany关系的实体“购物车”。当我在提供大约2000次查询的视图中调用getter方法时。然后,页面的性能下降很大。
使用OneTMany assoc的实体购物车:
class Cart {
/**
* @ORM\OneToMany(targetEntity="Comiti\UserBundle\Entity\Subscription", mappedBy="cart")
*/
protected $subscriptions;
}我的实体订阅ManyToOne assoc:
class Subscription {
/**
* @ORM\ManyToOne(targetEntity="Comiti\UserBundle\Entity\Cart",inversedBy="subscriptions")
* @ORM\JoinColumn(name="cart_id", referencedColumnName="id")
* @JMS\Exclude()
*/
protected $cart;
}我的小枝视图调用getSubscriptions()生成了许多数据库请求:
{% for subscription in cart.subscriptions %}我该怎么做才能得到更好的表演?
发布于 2016-03-24 15:21:46
您正在经历的问题称为N+1问题。您正在获取一个实体,该实体具有关联,然后再遍历和查询。在您的具体示例中,假设订阅有一定的成本,则在此循环中会发生这种情况:
{% for subscription in cart.subscriptions %}
{{ subscription.cost }}考虑到您已经查询了一个购物车,您还没有加载它的所有订阅和属性,这是在循环时发生的。为了解决这个问题,您应该在您的购物车上做一个带有订阅的取接:
// 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();
}这将为您添加一个购物车对象,并将其订阅加载到内存中。
https://stackoverflow.com/questions/36202991
复制相似问题