簡體   English   中英

Symfony 2 OneToMany性能優化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM