[英]Symfony 2 OneToMany performance optimisation
我在我的網站上發現了性能問題。 我有一個與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 %}
我該怎么做才能獲得更好的性能?
您遇到的問題稱為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();
}
這將為您充填一個Cart對象,並將其預訂加載到內存中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.