2015-10-19 70 views
0

因此,我的數據庫中有4個表。產品,類別,ProductCategory和ProductSubcategory。Symfony2,PHP在減少數據庫中多個對象時減少查詢權重

這些表格處於ManyToMany關係。

所有產品保存在表中:產品。

所有分類和子分類保存在一個表中:分類。

產品可以有一個子類別沒有類別,可以有兩個,或可以有一個沒有任何子類別的類別。

產品分類和ProductSubcategory持有的所有關係。(產品和CATEGORY_ID/subcategory_id)

現在在我的樹枝我要統計有多少產品做的類別和子類別保持。爲此,我使用Twig Extensions。

子類別

計數許多產品是如何在一個子類別是容易的,它的工作原理。

在枝杈:

{% for subcategory in categories.children %} 

    [{{ getProductsBySubcategory(subcategory.id) }}] 

{% endfor %} 

功能:

public function getProductsBySubcategory($id) 
    { 
    $products = 0; 

    $subcategories = $this->doctrine->getRepository('MpShopBundle:ProductSubcategory')->findBy(array('subcategory' => $id)); 

    foreach ($subcategories as $subcategory) { 
     $products++; 
    } 

    return $products; 

    } 

對於類別:

對於A類的有點不同。在這裏,我要計算類別中的所有產品以及此類別所具有的子類別中的所有產品。首先我檢查該類別是否有產品,如果有,我將它添加到數組中。然後我檢查這個類別是否有子類別。如果是這樣,我從子類別獲取所有產品並將它們添加到相同的數組中。現在,如果產品在類別和子類別中,我不想重複計數。這就是爲什麼我將所有內容都存儲在數組中(以後再做array_unique)。

我的枝杈:

[{{ getProductsByCategory(categories.id)|length }}] 

功能:

public function getProductsByCategory($id) 
    { 
    $category = $this->doctrine->getRepository('ApplicationSonataClassificationBundle:Category')->find($id); 
    $productCategories = $this->doctrine->getRepository('MpShopBundle:ProductCategory')->findBy(array('category' => $id)); 
    $productSubcategories = $this->doctrine->getRepository('MpShopBundle:ProductSubcategory')->findAll(); 
    $products = array(); 

    foreach($productCategories as $productCategory) { 

     array_push($products, $productCategory->getProduct()->getId()); 
    } 

    foreach($productSubcategories as $productSubcategory) { 

     $subcategory = $productSubcategory->getSubcategory(); 

     if($subcategory->getparent() == $category) { 
      array_push($products, $productSubcategory->getProduct()->getId()); 
     } 

    } 
     $result = array_unique($products); 

    return $result; 

    } 

問題:

一切工作的地方。我收到了正確的號碼。但是,當我切換到Live時,出現錯誤:500。我想這可能是因爲Live有成千上萬的產品和分類。所以foreach循環正在破壞服務器。或者也許是因爲我將所有東西都保存在數組中?

我該怎麼辦?這是服務器問題,我需要增加一些東西嗎?或者也許有一種方法可以不使用數組並減少循環次數?但如何檢查重複呢?

日誌顯示此:

Allowed memory size of 536870912 bytes exhausted (tried to allocate 77 bytes) in /var/www/kd_cms/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/DataCollector/DataCollector.php on line 40 
+0

檢查錯誤日誌,錯誤500是一個 「內部服務器錯誤」 – Epodax

+0

我知道。但是,如果我正在計數產品,我只能得到這個結果。如果我刪除了計數,服務器將重新聯機。 – Dominykas55

+0

您需要檢查日誌以獲得更準確的錯誤消息。或者像Elao那樣安裝一些擴展程序,以通過電子郵件通知錯誤。 – Jean

回答

1

DQL比的foreach大分貝更快對象

// .../ProductCatRepository.php 
public function findDistinctProductsByCat($catId) 
{ 
    $query = $this->createQueryBuilder('entity') 
     ->leftjoin('entity.category', 'cat') 
     ->andWhere('cat.id = :cat') 
     ->setParameter('cat', $catId) 
    ; 
    return $query->getQuery()->getResult(); 
} 

// .../ProductSubCatRepository.php 
public function findDistinctProductsByCatSubCat($catId) 
{ 
    $query = $this->createQueryBuilder('entity') 
     ->leftjoin('entity.subcategory', 'subcat') 
     // maybe missing a leftJoin with cat idk your mapping 
     // ->leftJoin('subcat.category', 'cat') 
     // ->andWhere('cat.parent = :cat') 
     ->andWhere('subcat.parent = :cat') 
     ->setParameter('cat', $catId) 
    ; 
    return $query->getQuery()->getResult(); 
} 


public function getProductsByCategory($id) 
{ 
$categoryId = $id; 

$productsCat = $this->doctrine->getRepository('MpShopBundle:ProductCat')->findDistinctProductsByCat($categoryId); 
$productsSubCat = $this->doctrine->getRepository('MpShopBundle:ProductSubCat')->findDistinctProductsByCatSubCat($categoryId); 
// ArrayCollection::count() 

return array('count_cat' => $productsCat->count(), 'product_subcat' => $productsSubCat->count(), 'result' => array_unique(array_merge($productsSubCat, $productsCat))); 
} 
+0

考慮在答案中添加註釋和/或解釋。 @rommct – Veve

+0

令人驚歎。謝謝! – Dominykas55