2016-03-24 84 views
0

我在我的網站上發現了性能問題。 我有一個實體「購物車」與oneToMany關係。當我在一個給出大約2000個查詢的視圖中調用getter方法時。那麼頁面的性能會非常強烈地下降。Symfony 2 OneToMany性能優化

我與OneTMany assoc命令實體車:

class Cart { 
    /** 
    * @ORM\OneToMany(targetEntity="Comiti\UserBundle\Entity\Subscription", mappedBy="cart") 
    */ 
    protected $subscriptions; 
} 

我的實體認購與多對一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 %} 

我能做些什麼來獲得更好的表現呢?

回答

1

您遇到的問題稱爲N + 1問題。您正在獲取具有關聯的實體,然後再遍歷並再次查詢。在您的具體的例子,這發生在這個循環中,假設您的訂閱有代價的:

{% for subscription in cart.subscriptions %} 
    {{ subscription.cost }} 

既然你已經詢問了車,你有沒有載所有訂閱和它的屬性,那就是發生在循環時間。爲了解決這個問題,你應該在你的車做一個fetch join與訂閱:

// 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(); 
} 

這將滋潤你在內存中加載它的訂閱一個車對象。