Используем функции SQL или заметка про CDbExpression
Рубрика: Мелкие заметки на тему Yii
31 Окт. 2009Если вы хорошо знакомы с языком SQL, то наверняка любите использовать всякие встроенные функции для упрощения жизни. Сегодня мы с вами поговорим о том как легко использовать их в своих yii запросах.
---Как обычно я просматривал форум в поисках интересных идей для изучения и натолкнулся на этот пост. Автор попросил подсказать ему как использовать DATE_FORMAT в результате выборки.
Если вы захотите просто в select атрибуте указать данную функцию — ничего не выйдет. Yii устроен так, что обводит в кавычки парраметры подставляя их в запрос. Как вы понимаете в кавычках данная функция теряет всю свою силу и воспринимается как обычная строка.
Именно по этому начиная с версии 1.0.2 в Yii был добавлен способ решения данной проблемы. Используя CDbExpression вы можете подставить в запрос любое выражение, которое не будет автоматически экранированно Yii.
Например, вот так работать НЕ будет:
$criteria = new CDbCriteria();
$criteria->select = "NOW()"
Потому что Yii попробует выполнить запрос в котором функция будет представлена как обычная строка:
SELECT "NOW()"
Вот так будет правильно:
$criteria = new CDbCriteria();
$criteria->select = new CDbExpression("NOW()");
Потому что Yii попробует выполнить функцию не обводя её в кавычки:
SELECT NOW()
Пользуйтесь на здоровье! :)
Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
- Вот и порадовали нас новой версией любимого фреймворка. Хотелось бы отметить что на этот раз исправлений ошибок оказалось меньше чем ... "Yii PHP framework 1.0.9"
- Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут ... "Урок 6 : Регистрация и авторизация. Часть 1"
- Сегодня обнаружил что Sam Dark как и обещал перевел интерисующюю практически всех часть документации про RBAC.
next
Благодаря таким людям - ... "Перевод : Аутентификация и авторизация (RBAC)"

[guest] Wra
Было сказано: Суббота, 31 Октябрь 2009
Как это добавить к уже имеющемуся $criteria->select?

[guest] Ekstazi
Было сказано: Воскресенье, 01 Ноябрь 2009
А с вложеными селектами как ? Не проверял ?

[guest] Ekstazi
Было сказано: Воскресенье, 01 Ноябрь 2009
Wra, $criteria->select сам по себе может являться массивом строк.

[adm] zolter
Было сказано: Воскресенье, 01 Ноябрь 2009
Вложенный не проверял но походу дела должен работать. Т.е. если вложенный тупо всунуть через CDbExpression как обычный sql

[guest] Гость
Было сказано: Среда, 18 Ноябрь 2009
А как потом обратиться к результату? Т.е. есть группировка по полю, я выбираю в селект значение какого то поля и экспрешн COUNT(*) AS numResult. В результате формируется корректный запрос, но в результирующией модели $model->numResult ничего не передается (только 0 объявленный как паблик в моделе).

[guest] zolter
Было сказано: Среда, 18 Ноябрь 2009
А покажите весь кусочек кода, где запрос формируете

[guest] Гость
Было сказано: Среда, 18 Ноябрь 2009
Вот кусок портлета сайдбара (вывод тегов):
$criteria=new CDbCriteria;
$tmp[] = 'tagTitle';
$tmp[] = new CDbExpression("COUNT(tagTitle) as numObjects");
$criteria->select = $tmp;
$criteria->group = 'tagTitle';
$criteria->limit = $limit;
$res = Tags::model()->findAll($criteria);
При этом по логам формируется корректный запрос, но в результирующем AR информация об numObjects отсутствует.

[guest] RSol
Было сказано: Четверг, 19 Ноябрь 2009
Я в одном из приложений сделал:
$criteria=new CDbCriteria;
$criteria->select='MIN(inserttime) as inserttime';
:-)

[guest] Гость
Было сказано: Среда, 07 Апрель 2010
подскажите пожалуйста в чем ошибка
$criteria = new CDbCriteria;
$criteria->select = new CDbExpression("MAX(sort_order) as maximum");
$criteria->condition = 'id_subcat=:id';
$criteria->params = array(':id'=>2);
$max_count = Product::model()->findAll($criteria);
вроде бы ошибки нету, но и нужного результата тоже не получил или может его "достовать" из $max_count нужно по особому?
Вроде бы в коментах выше подобное обсуждалось но почему то решение никто не написал:(

[adm] zolter
Было сказано: Среда, 07 Апрель 2010
Добрый день,
Просто добавьте в модель новый атрибут:
public $maximum;

[guest] Олег
Было сказано: Вторник, 10 Август 2010
А можно ли в именованных групах условий использовать CDbEexpression?
Например вот так не работает:
return array(
'published'=>array(
'condition'=>'a_hidden=0',
),
'coming'=>array(
'condition'=>'a_datetime > '.CDbExpression('NOW()'),
)
);
}

[guest] Доброжелатель
Было сказано: Среда, 11 Август 2010
Наверное надо быть инопланетянином чтобы понять и запомнить все эти ужасы :)


