Контент


Ko3: знаете ли вы? Часть 3

  1. Если надо использовать функции СУБД (типа 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();

  2. С помощью Query Builder можно реализовать множественную вставку записей одним запросом:

    DB::insert($table_name)
        ->columns($columns)
        ->values($set1)
        ->values($set2)
        ->values($set3)
        ->execute();

  3. Частенько бывает необходимо сохранить в шаблоне какие-то переменные (например, в конструкторе или в before()). Но что, если надо (в зависимости от каких-либо условий) поменять текущий шаблон на другой? Казалось бы, мы потеряем часть сохраненных данных? На помощь придет метод set_filename(), по названию которого можно догадаться, что мы устанавливаем новый путь к обрабатываемому шаблону. При этом все свойства шаблона (в том числе и подшаблоны) останутся на месте:

    // было 
    $this->template = View::factory('new/template');
    // стало
    $this->template->set_filename('new/template');

    При этом помним, что для вызова метода set_filename() необходимо, чтобы искомая переменная была объектом View. В случае с Controller_Template $this->template из строки во View превращается в методе before().

  4. Методы set() и get() класса Session не позволяют работать с переменными-массивами, т.е. надо сперва извлечь весь массив, потом поработать с ним и сохранить обратно. Удобно использовать такой подход:

    $data = & Session::instance()->as_array();
    // дальше делаем с массивом, что хотим
    $data['foo'] = array('bar');

  5. Как мы знаем, методы find() и find_all() моделей ORM сбрасывают текущие условия выборки. Часто бывает нужно сохранить их для следующего запроса (например, для пагинатора нужно еще и общее число записей). Для этого есть специальный метод reset(), который позволяет не только сбрасывать модель, но и сохранять ее текущее состояние:

    $user = ORM::factory('user');
        ->where('activated', '=', 1);
    $user->reset(FALSE); // просим ORM не сбрасывать состояние после запроса
    $total = $user->count_all();
    $users = $user->find_all();

  6. Многие рутинные вещи в Kohana уже присутствуют, так что не стоит изобретать свои велосипеды. Например, в классе Date есть константы для перевода календарных единиц в секунды (Date::MINUTE, Date::HOUR, Date::YEAR и т.д.). Еще в нем есть очень полезные методы для работы с датой (вычисление количества минут/часов/лет, форматирование даты и т.д.). Также и в хэлпере Text полным-полно нужных функций (о них я писал ранее).
  7. Используете в проекте защиту от CSRF? Тогда методы Security::token() и Security::check($token) Вам в помощь. Первый метод возвращает сгенерированный токен (берет из сессии, если нет — генерирует новый), а второй осуществляет сравнение с переданным значением $token (можно использовать как правило валидации).
Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Опубликовано в знаете ли вы.

Теги: , , , , , .


Комментарии (8)

Будьте в курсе обсуждения, подпишитесь на RSS ленту комментариев к этой записи.

  1. Макс пишет:

    За 7й Спасибо! Как раз надо в форме применить.

  2. AeR пишет:

    Спасибо!

  3. xbagir пишет:

    Спасибо! в закладки добавил.

  4. bvn пишет:

    А мне 5-ый совет очень по вкусу пришелся. Жаль я его раньше не знал, успел наговнокодить с клонированием объектов…

  5. biakaveron пишет:

    @bvn
    На самом деле в последнее время он (пункт №5, а точнее — вопросы, связанные с его решением) достаточно часто начал появляться в сети. На форуме Kohana, на StackOverflow. Не знаю, с чем это связано, но вот последние месяца три наверное такую ситуацию наблюдаю ))

  6. Александр пишет:

    а как сделать TRUNCATE?

  7. biakaveron пишет:

    DB::query(NULL, ‘TRUNCATE TABLE …’)

  8. Александр пишет:

    спасибо. Работает



Можно включить подсветку кода: <code><pre lang="">...</pre></code>
Разрешены некоторые HTML теги

или используйте trackback.