Вывод модели с группировкой по полю
Вывод модели с группировкой по полю
Может и глупый вопрос, но красивого решения так и не нашел.
К примеру модель Albums имеет поля id, title, year
Нужно сгруппировать их по году и вывести год, потом списком альбомы этого года.
Так:
year
- title
- title
- title
year
- title
- title
Есть идея получить DISTINCT(year) и передавать их во view и перебирать 2 массива. Но идея кажется глупой.
К примеру модель Albums имеет поля id, title, year
Нужно сгруппировать их по году и вывести год, потом списком альбомы этого года.
Так:
year
- title
- title
- title
year
- title
- title
Есть идея получить DISTINCT(year) и передавать их во view и перебирать 2 массива. Но идея кажется глупой.
Re: Вывод модели с группировкой по полю
Выбрать все и переложить в массив с ключом по году?
-
- Сообщения: 350
- Зарегистрирован: 2009.09.17, 16:47
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Вывод модели с группировкой по полю
Можно отсортировать по году и при выводе проверять в цикле, если у предыдущего элемента, год отличается от текущего, то делать то-то...
Предупрежден - значит вооружен.
devKP.ru
devKP.ru
Re: Вывод модели с группировкой по полю
У меня тоже вопрос по групировке встал )))
Вот есть код:
Релейшены - типа HAS_MANY.
Выбираем все одним запросом (везде together).
Такой код сам по себе не рабочий - так как activeProvider ставит LIMIT, и выбираются первые 10 записей из результата джойнов, а так как связи HAS_MANY, то одной модели Request соответсвуют несколько строк.
Но если в критерии поставить 'group' => 't.id' - то он выбирает правильно (я судил по кол-ву строк).
Как так?
Ведь GROUP он же всего-лишь группирует, но никак не объеденяет строки, если они разные?
Вот есть код:
Код: Выделить всё
$dataProvider = new CActiveDataProvider('Request', array(
'criteria' => array(
'with' => array(
'offers' => array('together' => true),
'orders' => array('together' => true),
),
'together' => true,
))
);
Выбираем все одним запросом (везде together).
Такой код сам по себе не рабочий - так как activeProvider ставит LIMIT, и выбираются первые 10 записей из результата джойнов, а так как связи HAS_MANY, то одной модели Request соответсвуют несколько строк.
Но если в критерии поставить 'group' => 't.id' - то он выбирает правильно (я судил по кол-ву строк).
Как так?
Ведь GROUP он же всего-лишь группирует, но никак не объеденяет строки, если они разные?
Последний раз редактировалось mitaichik 2011.11.24, 23:23, всего редактировалось 1 раз.
Re: Вывод модели с группировкой по полю
Автору топика: в мозг пришли 2 способа.
1 - стандартный - выбираем всю таблицу, потом в foreach смотрим: если год изменился - выводим заголовок года (я б так сделал)
2 - нестандартный - в мускуле делаем CONCAT title GROUP BY year, уже в php превращаем это в массив с пом. explode
1 - стандартный - выбираем всю таблицу, потом в foreach смотрим: если год изменился - выводим заголовок года (я б так сделал)
2 - нестандартный - в мускуле делаем CONCAT title GROUP BY year, уже в php превращаем это в массив с пом. explode
Re: Вывод модели с группировкой по полю
Сделал примерно так:
Код: Выделить всё
foreach ($model as $m) {
$years[$m->year][] = $m;
}
foreach ($years as $year => $album) {
echo $year;
foreach ($album as $a) {
echo $a->title;
}
}
Re: Вывод модели с группировкой по полю
Просто на всякий случай брошу здесь.
Не все знают, что у CHtml::listData() есть ещё параметр группы.
Например:
получите массив
Не все знают, что у CHtml::listData() есть ещё параметр группы.
Например:
Код: Выделить всё
CHtml::listData(MyModels::model()->findAll(), 'id', 'name', 'group');
Код: Выделить всё
array(
'group_1'=>array(
1=>'name_1',
2=>'name_2'
),
'group_2'=>array(
3=>'name_3',
4=>'name_4'
)
)
Конференция: yii@conference.jabber.ru
Re: Вывод модели с группировкой по полю
Балин, в натуре!!!!
Re: Вывод модели с группировкой по полю
Спасибо. Теперь знаем