Как получить следующий массив из базы данных?

Хорошо, чтобы было понятнее: я использую doctrine.

У меня есть таблица Бренды и продукты

Brand
  id
  name

Product
  id
  name
  brand_id

У меня есть много брендов и продуктов этих брендов в базе данных. Я хотел бы получить список брендов (+ количество его продуктов), сгруппированных по первому последнему Brand.name.

ex: 
array( 
   n => array( 
        0 => array('Nike', 4 ),
        1 => array('North Pole', 18) 
        .....
   )
   .....
)

Итак, мой вопрос заключался в том, можно ли это сделать с помощью одного запроса эффективным способом. Я действительно не хочу запускать отдельные запросы для каждого первого имени бренда. Доктрины иерархических данных приходят мне на ум, но я верю, что это совсем другое? Спасибо


person simple    schedule 22.01.2011    source источник
comment
Есть предположения? может быть несколько слов-подсказок, что гуглить =)   -  person simple    schedule 23.01.2011
comment
Существует NativeQuery, который можно использовать для выполните SQL-запрос, который объединяет две таблицы, группирует по брендам и подсчитывает продукты, затем вы выполняете постобработку массива, но должен быть лучший способ.   -  person outis    schedule 23.01.2011
comment
Пожалуйста, добавьте тег/ссылку, если это Доктрина 1 или 2.   -  person DrColossos    schedule 26.01.2011


Ответы (3)


Если вы собираетесь использовать эту форму результата более одного раза, возможно, стоит сделать форматирование в Hydrator, как описан здесь.

В вашем случае вы можете создать запрос, который выбирает 3 столбца

  1. первая буква названия бренда
  2. название бренда
  3. подсчет(продукт.id)

Затем увлажните результат

$results = $q->execute(array(), 'group_by_first_column');
person rong    schedule 17.07.2011

Вы не можете взять его из базы данных таким образом, но вы можете получить данные в виде объектов или массивов, а затем преобразовать их в описанную форму. Используйте циклы foreach.

person smentek    schedule 22.01.2011

При использовании Doctrine вы также можете использовать необработанные SQL-запросы и массивы гидратов вместо объектов. Поэтому моим решением было бы использовать собственный SQL-запрос:

SELECT 
  brand.name,
  count(product.id) 
FROM 
  brand 
JOIN 
  product ON 
  brand.id=product.brand_id 
GROUP BY 
  brand.id ORDER BY brand.name;

А затем перебрать в PHP результат, чтобы построить нужный массив. Поскольку результат упорядочен по Brand Name, это довольно просто. Если бы вы не сохраняли абстракцию базы данных, я думаю, что также должна быть возможность выразить этот запрос в DQL, просто гидратируйте массив вместо объектов.

person Marko    schedule 25.01.2011