我在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";
}
}
}
这相当于在数据库上点击 30 次。(29个类别)所以没关系。我的问题是只想从''原则''通用''集合''集合中获取唯一的产品名称
您可以看到我复杂的代码来循环浏览产品名称,将它们放在一个数组中,然后对其调用array_unique。当然有效,但必须有一种更优雅的方式。
您可以在存储库中创建特殊查询并使用 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 不是一个很好的文档,但至少你明白了:
- 分组依据
- 不同