Вывод модели с группировкой по полю

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Bublik
Сообщения: 59
Зарегистрирован: 2011.01.31, 21:48

Вывод модели с группировкой по полю

Сообщение Bublik »

Может и глупый вопрос, но красивого решения так и не нашел.

К примеру модель Albums имеет поля id, title, year

Нужно сгруппировать их по году и вывести год, потом списком альбомы этого года.
Так:

year
- title
- title
- title
year
- title
- title

Есть идея получить DISTINCT(year) и передавать их во view и перебирать 2 массива. Но идея кажется глупой.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Вывод модели с группировкой по полю

Сообщение Nafania »

Выбрать все и переложить в массив с ключом по году?
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: Вывод модели с группировкой по полю

Сообщение SpiLLeR »

Можно отсортировать по году и при выводе проверять в цикле, если у предыдущего элемента, год отличается от текущего, то делать то-то...
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Вывод модели с группировкой по полю

Сообщение mitaichik »

У меня тоже вопрос по групировке встал )))

Вот есть код:

Код: Выделить всё

$dataProvider = new CActiveDataProvider('Request', array(
    'criteria' => array(
        'with' => array(
             'offers' => array('together' => true),
             'orders' => array('together' => true),  
        ),
        'together' => true,
    ))
);  
 
Релейшены - типа HAS_MANY.
Выбираем все одним запросом (везде together).
Такой код сам по себе не рабочий - так как activeProvider ставит LIMIT, и выбираются первые 10 записей из результата джойнов, а так как связи HAS_MANY, то одной модели Request соответсвуют несколько строк.

Но если в критерии поставить 'group' => 't.id' - то он выбирает правильно (я судил по кол-ву строк).

Как так?

Ведь GROUP он же всего-лишь группирует, но никак не объеденяет строки, если они разные?
Последний раз редактировалось mitaichik 2011.11.24, 23:23, всего редактировалось 1 раз.
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Вывод модели с группировкой по полю

Сообщение mitaichik »

Автору топика: в мозг пришли 2 способа.
1 - стандартный - выбираем всю таблицу, потом в foreach смотрим: если год изменился - выводим заголовок года (я б так сделал)
2 - нестандартный - в мускуле делаем CONCAT title GROUP BY year, уже в php превращаем это в массив с пом. explode
Bublik
Сообщения: 59
Зарегистрирован: 2011.01.31, 21:48

Re: Вывод модели с группировкой по полю

Сообщение Bublik »

Сделал примерно так:

Код: Выделить всё

foreach ($model as $m) {
    $years[$m->year][] = $m;
}

foreach ($years as $year => $album) {
    echo $year;
    foreach ($album as $a) {
        echo $a->title;
    }
}
 
Johnatan
Сообщения: 167
Зарегистрирован: 2010.10.27, 13:06
Откуда: Reino de España

Re: Вывод модели с группировкой по полю

Сообщение Johnatan »

Просто на всякий случай брошу здесь.
Не все знают, что у 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
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: Вывод модели с группировкой по полю

Сообщение mitaichik »

Балин, в натуре!!!!
Bublik
Сообщения: 59
Зарегистрирован: 2011.01.31, 21:48

Re: Вывод модели с группировкой по полю

Сообщение Bublik »

Спасибо. Теперь знаем :)
Ответить