我必须进行查询才能找到我所有的产品目录,然后以这种方式在我的视图中列出它们:
category:
product
product
product
.......
category:
product
product
porduct
.......
etc
我做这个咨询,但是,因为我无法按顺序显示它们,因为咨询只给我带来了产品,我想按类别对它们进行排序。
public function findOneByIdJoinedToCategory($id)
{
$query = $this->getEntityManager()
->createQuery(
'SELECT p, c FROM AcmeStoreBundle:Product p
JOIN p.category c
WHERE p.id = :id'
)->setParameter('id', $id);
try {
return $query->getSingleResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
}
我该怎么办? 我认为像咨询一样,按类别将产品组带给我,然后进行切割控制。 但不是怎么做。
感谢。
答案 0 :(得分:0)
您的方法名称为findOneByIdJoinedToCategory
,这对我意味着您只会选择一种产品,那么为什么如果它只是一种产品,您需要对它们进行排序?或者,您应该重命名此方法。
如果您尝试选择按类别分组或排序的所有产品,您可以撤消DQL以选择类别并对其进行排序,然后您可以使用getter获取每个类别的产品:
$query = $this->getEntityManager()
->createQuery(
'SELECT c FROM AcmeStoreBundle:Category c ORDER BY c.name ASC'
);
然后,对于每个类别,您都可以获得他们的产品:
$category->getProducts();
如果此解决方案无法满足您的需求,您可以继续使用您的方法,但需要将DQL更改为:
$query = $em->createQuery('SELECT p FROM Product p JOIN p.category c ORDER BY c.name ASC');
或者如果你想使用group by子句,它将如下所示:
$em->createQuery('SELECT u FROM Product p JOIN p.category c GROUP BY c.name');
答案 1 :(得分:0)
您可以尝试:
use \Doctrine\ORM\Query\Expr\Join;
$em = $this->getContainer()->get('doctrine.orm.entity_manager');
$result = $em
->createQueryBuilder()
->select('c.name AS category, p.name AS product')
->from('AppBundle:Product', 'p')
->leftJoin('AppBundle:Category', 'c', Join::WITH, 'p.category = c.id')
->orderBy('category', 'DESC')
->addOrderBy('product', 'DESC')
->getQuery()
->getArrayResult()
;
结果你会得到类似的东西:
array (
0 =>
array (
'category' => 'c1',
'product' => 'p1',
),
1 =>
array (
'category' => 'c2',
'product' => 'p2',
),
// ...
)
希望这完全是你的愿望。