DbHelp.ru
Маленький Yii блог
Комментарии
Гость: компьютерная диагностика вольво XC90 быстро определим и...
Гость: parx online casino 456 free slots casino plainridge casino online casino gambling online cas...
Гость: Купить авто с пробегом в кредит. Если вы желаете приобр...
Гость: buy legal fda approved cialis what is the best brand cialis effetti cialis femminil viagra or cialis...
Гость: tranny generic cialis cialis professional from usa compra cialis postepa buy cialis how to buy ciali...



Сервер Ultima Online - Forest Wars (от создателя данного блога)

Используем функции SQL или заметка про CDbExpression

Рубрика: Мелкие заметки на тему Yii

Оцените эту статью:

Рейтинг: 0.00 (0)
31 Окт. 2009
Опубликовать в Twitter Написать в Facebook Опубликовать в своем блоге livejournal.com

Если вы хорошо знакомы с языком SQL, то наверняка любите использовать всякие встроенные функции для упрощения жизни. Сегодня мы с вами поговорим о том как легко использовать их в своих yii запросах.

---

Как обычно я просматривал форум в поисках интересных идей для изучения и натолкнулся на этот пост. Автор попросил подсказать ему как использовать DATE_FORMAT в результате выборки.

Если вы захотите просто в select атрибуте указать данную функцию — ничего не выйдет. Yii устроен так, что обводит в кавычки парраметры подставляя их в запрос. Как вы понимаете в кавычках данная функция теряет всю свою силу и воспринимается как обычная строка.

Именно по этому начиная с версии 1.0.2 в Yii был добавлен способ решения данной проблемы. Используя CDbExpression вы можете подставить в запрос любое выражение, которое не будет автоматически экранированно Yii.

Например, вот так работать НЕ будет:

 $criteria = new CDbCriteria();  
$criteria->select = "NOW()"

Yii Framework Blog img http://dbhelp.ruaaaa1Потому что Yii попробует выполнить запрос в котором функция будет представлена как обычная строка:

SELECT "NOW()"

 

Вот так будет правильно:

 $criteria = new CDbCriteria(); 
$criteria->select = new CDbExpression("NOW()");

Yii Framework Blog img http://dbhelp.ruaaaa2 Потому что Yii попробует выполнить функцию не обводя её в кавычки:

SELECT NOW()

 

Пользуйтесь на здоровье! :)



Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
Другие yii статьи:

  1. Очень долго у меня в голове летает мысль создания собственной хостинг компании. Моим основным заработком уже пол года является чистый ... "#01 : Введение"

  2. Давайте сегодня немного поработаем со всевозможными настройками которые нам предоставляет стандартный класс для работы с капчей (CCaptcha). next Давайте для начала ... "Изменяем нашу каптчу (captcha)"

  3. Мы постоянно совершенствуем свои приложения позволяя пользователям загружать свои документы, аватарки и др. Хочешь упростить все эти функции? Читай обзор ... "Обзор дополнения CFile"

[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] Гость

Было сказано: Среда, 18 Ноябрь 2009

Все заработало…

[guest] zolter

Было сказано: Среда, 18 Ноябрь 2009

гуд! :)

[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

Наверное надо быть инопланетянином чтобы понять и запомнить все эти ужасы :)

[adm] zolter

Было сказано: Среда, 11 Август 2010

ну не обязательно :))

Оставить комментарий


Код:
Имя: