1

我在实体之间有一个多对多关联:(产品和类别)在 Symfony2 中,使用 Doctrine2。

我想列出每个类别,然后列出该类别中的每个唯一产品名称。每个产品显然可以分为许多类别(有些类别是空的)。

这是我必须使用基本实体管理器方法等的方法。注释是 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 回答