DbHelp.ru
Маленький Yii блог
Комментарии
Гость: viagra online usa online pharmacy viagraiy.com buying viagra ireland http://viagraiy.com/ cheap...
Гость: http://shkwiki.de/index.php?title=Watch_Streaming_Now_%C2%ABS%D0%BF%D0%B0%D1%80%D1%82%D0%B0%C2%BB_%C...
Гость: http://proline.physics.iisc.ernet.in/wiki/index.php/User:Mora65L481 http://proline.physics.iisc.erne...
Гость: viagra online cheap viagra prescription viagraiy.com prices for viagra http://viagraiy.com/ can...
Гость: http://proline.physics.iisc.ernet.in/wiki/index.php/User:MilanWoodbury http://proline.physics.iisc.e...



Сервер 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. Хорошая практика для любого серьезного фреймворка - дать пользователям на растерзание новый релиз до его официального появления для массы (пусть ... "Yii 1.1.13 RC"

  2. С Yii вы можете очень просто создавать ajax запросы. В большинстве случаев во время выполнения запроса, для наглядности, стоит ... "Как добавить ajax preloader"

  3. Я думаю, всем нам в жизни приходилось слышать такое слово как «фреймворк». Многие из вас действительно вникли в саму ... "Шаг 1: Что такое фреймворк?"

[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

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

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


Код:
Имя: