2016-03-24 24 views
0

Web sitemde bir performans sorunu buldum. OneToMany ilişkisi olan bir "Cart" var. Yaklaşık 2000 sorgu veren bir görünümde getter yöntemini çağırdığımda. Daha sonra sayfanın performansı çok güçlü bir şekilde azalır.Symfony 2 OneToMany performans optimizasyonu

OneTMany assoc ile My varlık Sepeti:

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

ManyToOne assoc ile My varlık Abonelik: getSubscriptions ait çağrı (

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

My dal görüntüsü) veri tabanı birçok istek üreten:

{% for subscription in cart.subscriptions %} 

Daha iyi performanslar elde etmek için ne yapabilirim?

cevap

1

Yaşadığınız sorun, N + 1 sorunu olarak adlandırılır. Daha sonra geçiş yapıp tekrar sorguladığınız bir ilişkilendirmeye sahip bir varlığa sahip olursunuz. somut örnekte, bu abonelikler bir bedeli olduğunu varsayarak, bu döngü içinde oluşur:, kendisine ait tüm abonelikler ve özelliklerini yüklü değil bir sepeti için sorgulanan ettik göz önüne alındığında

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

ve işte döngü zamanında oluyor. Bundan kaçınmak için, abonelikler ile Trenin üstünde fetch join yapmalıdır: Bu senin için bellekte yüklü olan abonelikler ile Sepeti nesnesi hidrat olacak

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

.