1

Doctrine2を使用して、Symfony2でエンティティ(製品とカテゴリ)の間に多対多の関連があります。

各カテゴリを一覧表示し、次にそのカテゴリ内の一意の製品名をそれぞれ一覧表示します。各製品は明らかに多くのカテゴリに分類できます (一部のカテゴリは空です)。

基本的なエンティティ マネージャー メソッドなどでそれを行う方法は次のとおりです。注釈は PHPStorm のヒントであり、コードの自動補完が機能します。

    $repository = $this->getDoctrine()->getRepository('SomeRandomBundle:Category');
    $categories = $repository->findAll();

    $response = '';

    /** @var $category Category  */
    foreach ($categories as $category){

        $products = $category->getProducts();

        if (!$products->isEmpty()){

            $productArr = array();

            /** @var $product Product */
            foreach ($products as $product){
                $productArr[] = $product->getName();
            }
            $productArr = array_unique($productArr);

            $response .= $category->getName() . "\n";

            foreach ($productArr as $prod){
                $response .= "\t$prod\n";
            }
        }
    }

これは、DB で 30 ヒットになります。(29 カテゴリ) それでいいです。私の問題は、 \Doctrine\Common\Collections\Collection から一意の製品名だけを取得したいことです

製品名をループし、それらを配列に入れてから array_unique を呼び出す複雑なコードを見ることができます。確かにうまくいきますが、もっとエレガントな方法が必要です。

4

1 に答える 1

2

リポジトリに特別なクエリを作成し、Group Byステートメントを使用できます。これにより、でコードが軽くなりますEntityManager。リポジトリのコードの下:

編集

namespace Acme\PersonalBundle\Repository;

use Doctrine\ORM\EntityRepository;

class CategoryRepository extends EntityRepository
{
    /**
     * Fetch unique product names
     *
     */
    public function fetchUniqueProductNames()
    {
        $query = $this->getEntityManager()
            ->createQuery('
        SELECT c.name, p.name FROM AcmePersonalBundle:Category c
        JOIN c.products p
            GROUP BY p.name'
        )
        try
        {
            return $query->getResult();
        }
        catch (\Doctrine\ORM\NoResultException $e)
        {
            return null;
        }
    }

DICTINCTあなたも助けることができますが、GROUP BYはるかに強力です:

        $query = $this->getEntityManager()
            ->createQuery('
        SELECT DISTINCT p.name FROM AcmePersonalBundle:Category c
        JOIN c.products p'
        //....

W3は優れたドキュメントではありませんが、少なくとも次のようなアイデアが得られます。

于 2013-01-26T01:27:49.890 に答える