- Если надо использовать функции СУБД (типа
SUM()
илиCOUNT()
), то по умолчанию Ko3 заключит имя функции в кавычки или апострофы (в зависимости от того, в качестве имени поля будет функция или как выражение where). Чтобы этого избежать, можно применить один из двух методов:
1. Класс Database_Expression. Он создан специально для подобных случаев. Для краткости удобно использоватьDB::expr($expression)
, который по сути аналогичен вызовуnew Database_Expression($expression)
. Вот примеры его использования:
// сформирует запрос SELECT COUNT(*) AS `cnt` FROM `blog` DB::select(DB::expr('COUNT(*) AS `cnt`'))->from('blog')->execute(); // сформирует запрос SELECT * FROM `blog` WHERE `created` > NOW() - INTERVAL 1 DAY DB::select()->from('blog')->where('created', '>', DB::expr('NOW() - INTERVAL 1 DAY'))->execute();
2. Если заключить в двойные кавычки имена полей внутри функций, то экранирование не произойдет. К сожалению, не подойдет для второго примера, зато сократит длину первого:
DB::select('COUNT("*") AS `cnt`')->from('blog')->execute();
- С помощью Query Builder можно реализовать множественную вставку записей одним запросом:
DB::insert($table_name) ->columns($columns) ->values($set1) ->values($set2) ->values($set3) ->execute();
- Частенько бывает необходимо сохранить в шаблоне какие-то переменные (например, в конструкторе или в
before()
). Но что, если надо (в зависимости от каких-либо условий) поменять текущий шаблон на другой? Казалось бы, мы потеряем часть сохраненных данных? На помощь придет методset_filename()
, по названию которого можно догадаться, что мы устанавливаем новый путь к обрабатываемому шаблону. При этом все свойства шаблона (в том числе и подшаблоны) останутся на месте:// было $this->template = View::factory('new/template'); // стало $this->template->set_filename('new/template');
При этом помним, что для вызова метода
set_filename()
необходимо, чтобы искомая переменная была объектом View. В случае с Controller_Template$this->template
из строки во View превращается в методеbefore()
. - Методы
set()
иget()
класса Session не позволяют работать с переменными-массивами, т.е. надо сперва извлечь весь массив, потом поработать с ним и сохранить обратно. Удобно использовать такой подход:
$data = & Session::instance()->as_array(); // дальше делаем с массивом, что хотим $data['foo'] = array('bar');
- Как мы знаем, методы
find()
иfind_all()
моделей ORM сбрасывают текущие условия выборки. Часто бывает нужно сохранить их для следующего запроса (например, для пагинатора нужно еще и общее число записей). Для этого есть специальный методreset()
, который позволяет не только сбрасывать модель, но и сохранять ее текущее состояние:$user = ORM::factory('user'); ->where('activated', '=', 1); $user->reset(FALSE); // просим ORM не сбрасывать состояние после запроса $total = $user->count_all(); $users = $user->find_all();
- Многие рутинные вещи в Kohana уже присутствуют, так что не стоит изобретать свои велосипеды. Например, в классе Date есть константы для перевода календарных единиц в секунды (
Date::MINUTE
,Date::HOUR
,Date::YEAR
и т.д.). Еще в нем есть очень полезные методы для работы с датой (вычисление количества минут/часов/лет, форматирование даты и т.д.). Также и в хэлпере Text полным-полно нужных функций (о них я писал ранее). - Используете в проекте защиту от CSRF? Тогда методы
Security::token()
иSecurity::check($token)
Вам в помощь. Первый метод возвращает сгенерированный токен (берет из сессии, если нет — генерирует новый), а второй осуществляет сравнение с переданным значением$token
(можно использовать как правило валидации).
Свежие записи
Метки
acl
auth
cache
captcha
CMS
css
database
db
docs
github
helpers
hooks
i18n
jelly
ko3
Kohana
Kohana3
kohana 3.2
kohana 3.3
locale
modules
oauth
ORM
php
relations
router3
routing
session
sprig
tutorials
uri
userguide
validation
версии
версии
заметки
знаете ли вы
мануал
модули
модули
напильник
редирект
релизы
с праздником!
учебник
За 7й Спасибо! Как раз надо в форме применить.
Спасибо!
Спасибо! в закладки добавил.
А мне 5-ый совет очень по вкусу пришелся. Жаль я его раньше не знал, успел наговнокодить с клонированием объектов…
@bvn
На самом деле в последнее время он (пункт №5, а точнее — вопросы, связанные с его решением) достаточно часто начал появляться в сети. На форуме Kohana, на StackOverflow. Не знаю, с чем это связано, но вот последние месяца три наверное такую ситуацию наблюдаю ))
а как сделать TRUNCATE?
DB::query(NULL, ‘TRUNCATE TABLE …’)
спасибо. Работает