2016-01-06 2 views
2

Я должен сделать запрос, чтобы найти меня весь каталог моих продуктов, а затем перечислить их на мой взгляд, таким образом:Поиск продуктов с соответствующими категориями symfony2?

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

Ваше имя метода findOneByIdJoinedToCategory, что означает, что вы собираетесь выбрать только один продукт, так зачем вам сортировать его, если это только один продукт? Или вы должны переименовать этот метод.

Если вы пытаетесь выбрать все продукты, сгруппированные или упорядоченные по категориям вы можете изменить ваш DQL для выбора категории и сортировать их, то вы можете получить продукты из каждой категории с геттером:

$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'); 

или если вы хотите использовать группу по статье она будет выглядеть следующим образом:

$em->createQuery('SELECT u FROM Product p JOIN p.category c GROUP BY c.name'); 
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', 
), 
    // ... 
) 

надеюсь, что это именно ваше желание.

Смежные вопросы