2016-03-24 36 views
0

私のウェブサイトでパフォーマンスの問題が見つかりました。 私はoneToMany関係を持つエンティティ "カート"を持っています。私は約2000のクエリを与えるビューでgetterメソッドを呼び出すとき。すると、ページのパフォーマンスが非常に低下します。Symfony 2 OneToManyパフォーマンス最適化

OneTManyの連想と私のエンティティカート:

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

ManyToOneの連想と私のエンティティのサブスクリプション:getSubscriptionsの呼び出し(と

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

マイ小枝ビュー)データベース要求の多くを生産する:

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

これはあなたのためにメモリにロードされ、そのサブスクリプションを持つカートオブジェクトを水和します。

関連する問題