Yii: Как использовать IF в CDbCriteria в MySQL запросе select в контроллере

Yii: Как использовать IF в CDbCriteria в MySQL запросе select в контроллере Бывают случаи, когда нужно в контроллере выполнить в mysql запросе сравнение значения поля таблицы и выполнить какую-то обработку. Покажем на примере оператора IF.

Например, у меня есть в талице MySQL поле дата окончания. В контроллере я отбираю из этой таблицы все записи, располагаю их по убыванию, но, вдруг, хочу, чтобы "дата окончания" сравнивалась с текущей датой и в зависимости от результата, визуально записи раскрашивались. Серым цветом – то, что уже прошло, зелёненьким – то, что ещё не завершилось.

Но городить огород не хочется каменный, хочется просто и эффективно, чтобы работало. Тут я и использую оператор IF в CDbCriteria в строке запроса mysql select.

В контроллер добавляю это самое сравнение (дописываю sql запрос):

public function actionIndex()
{
$criteria=new CDbCriteria(array( 
'order'=>'date_start DESC',
'with'=>'author',
));
$criteria->select = array(
   '*',      
   'IF(date_finish<= CURDATE(), "pasttrip", "futuretrip") AS pastorfuture', 
);
   
...
$dataProvider=new CActiveDataProvider('Trip', array(
'pagination'=>array(
'pageSize'=>Yii::app()->params['tripsPerPage'],
),
'criteria'=>$criteria,

));
То есть теперь у меня в dataProvideвб помимо всех полей таблицы (потому что используем '*'), теперь ещё есть "как бы"-поле 'pastorfuture'. Значит его надо и в классе как-то указать. Делается это просто добавлением переменной в начало класса:
class Trip extends CActiveRecord
{
public $pastorfuture;
...
Теперь как это использовать в виде. У нас уже в переменной pastorfuture записано либо "pasttrip", либо "futuretrip". В виде views/trip/index.php ничего не меняем, здесь прекрасно работает виджет CListView, который обращается к views/trip/_view.php. Вот в нём мы и можем теперь использовать наравне с другими полями и наше поле "pastorfuture":
<div class="view <?php echo $data->pastorfuture;?>"> 
...
Этот div обёртывает всю отдельную запись в списке. Остаётся добавить в main.css пару классов:
.pasttrip {
background: #dcdcdc;
}

.futuretrip {
background: #e6faca;
} 
 Теперь записи в списке окрашиваются.
 
Другой способ окрашивать строки аналогично CListView -  вот - CGridView - how to color rows depending on data values.
IF в CDbCriteria, mysql select в cdbcriteria оператор if
 
 

 

Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (2)     Подпишитесь на RSS комментариев к этой статье.

2 комментариев

#645
Serge говорит:
September 18, 2012 at 09:10 pm

Очень оригинально.

1. Формирование критерия в контроллере - это круто. Все принципы MVC - побоку. Такие вещи или в модели делаются или в сервисном слое...

2. Проверка на прошлое и будущее через запрос БД - аналогично. Не правильнее ли в представлении проверять посредством PHP? 

3. Насколько я помню в Yii для отображения подобных вещей был CListView. А там при помощи несложных манипуляций можно и окрашивание в разные цвета приклеить, как и в CGridView.

#649
almix говорит:
September 24, 2012 at 11:54 am

Serge,

1) Вы правы, но, в контроллере же работает. Мне главное, чтобы работало.

2) Тогда из базы выберутся лишние записи, и в виде уже их отсекать придётся. А так сразу выбираю только то, что необходимо. Или я не прав?

3) да, вот - CGridView - how to color rows depending on data values.