2017-11-24 6 views
2

によってデータベースからディスプレイ製品。symfonyの/ドクトリン - 私は<strong>カテゴリ</strong>エンティティへ<em>多対多の</em>関係で<em>自己参照</em><strong>カテゴリ</strong>エンティティ、<strong>製品</strong>エンティティを作成したカテゴリの子どもと親

例カテゴリ一覧:

MacBooks 
-MacBook Air 
--MacBook Air 11 
--MacBook Air 13 
-MacBook Pro 
--MacBook Pro 13 

私が選択したカテゴリに基づいて製品を取得しています。

public function getByCategory($category) 
{ 
    $qb = $this->createQueryBuilder('p'); 
    $qb->leftJoin('p.categories', 'c'); 
    $qb->where('c.url = :category'); 
    $qb->setParameter('category', $category); 

    return $qb->getQuery()->useQueryCache(true); 
} 

例えば製品がのMacBook Air 13カテゴリ内にあります。

したがって、カテゴリを選択した場合にのみコードが機能しますMacBook Air 13

親カテゴリの商品を表示するには? カテゴリのMacBookのMacBook Airから表示はすべて、MacBook Airの11で同じ

...などのカテゴリーのMacBook Air 11 のMacBook Air 13、からカテゴリのMacBook Air、私は製品を表示したいで例えば、 MacBook Air 13など...?

質問簡略化: すべての子供からすべての製品を取得する方法。

のMacBook - >のMacBook Air - > MacBook Airの11、MacBook Airの13

答えて

1

あなたは一つのことを試すことができます。指定したカテゴリのすべての子と親を取得してから、クエリビルダーでwhere...inを使用します。私たちは再帰呼び出しでそれを行うことができます。

YourController.php:

public function someAction(int $id) 
{ 

// ... 

    $category = $em->getRepository('YourBundle:Category')->find($id); 

    $categories = $this->getAllCategories($category); 
// OR 
// $categories = $this->getAllChildren($category); 

    $products = $em->getRepository('YourBundle:Product')->getByCategories($categories); 

// ... 

} 

private function getAllCategories(Category $category) 
{  
    return array_merge(
     $this->getAllChildren($category), 
     $this->getAllParents($category) 
    ); 
} 

private function getAllChildren(Category $category) 
{ 
    static $categories = array(); 
    $categories[] = $category->getId(); 

    if(!$category->getChildren()->isEmpty()) 
    { 
     foreach($category->getChildren() as $child) 
     { 
      $this->getAllChildren($child); 
     } 
    } 

    return $categories; 
} 

private function getAllParents(Category $category) 
{ 
    static $categories = array(); 

    if($category->getParent()) 
    { 
     $categories[] = $category->getParent()->getId(); 
     $this->getAllParents($category->getParent()); 
    } 

    return $categories; 
} 

ProductRepository.php:

// ... 

public function getByCategories(array $categories) 
{ 
    $qb = $this ->createQueryBuilder('p') 
       ->leftJoin('p.categories', 'c'); 
    $qb->where($qb->expr()->in('c.id', $categories)); 

    return $qb->getQuery()->getResult(); 
} 

// ... 

だから、我々はすべてのカテゴリから製品とそのすべての子と親または単にカテゴリからとそのすべての子を得ることができます。

希望します。

+0

うわー、このソリューションは私のものよりずっと優れています。ありがとう – user8810516

+0

あなたを助けてうれしいです。このロジックをコントローラからサービスに移すことができるかどうかはわかっています。それはより良い習慣です。 – Snegirekk

+0

確かに、すでにやった:)ありがとう – user8810516

関連する問題