Как получить следующий массив из базы данных? - PullRequest
3 голосов
/ 23 января 2011

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

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

Brand
  id
  name

Product
  id
  name
  brand_id

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

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

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

Ответы [ 3 ]

1 голос
/ 17 июля 2011

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

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

  1. первая буква brand.name
  2. brand.name
  3. count (product.id)

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

$results = $q->execute(array(), 'group_by_first_column');
0 голосов
/ 26 января 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, просто гидрировать массив вместо объектов.

0 голосов
/ 23 января 2011

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

...