База данных
Работа с базой осуществляется посредством библиотек CodeIgniter. Рекомендуем пользоваться Active Record Class в силу того, что это способствует расширяемости кода.
/*
* Метод query модели node, определяющий составляющий базового запроса для получения нод.
* Благодаря префиксу "_" становится подвластен системе хуков.
*/
...
function _query(){
return $this->db->select('nodes.*',FALSE) // второй параметр позволяет избежать экранизации символа *
->get('nodes');
}
...
function get($id){
$this->db->where('id',$id);
return $this->query()->row();
}
...
/*
* Воздействуем на запрос ноды из компонента user через хуки.
* Обратите внимание, что хук выполняется до вызова метода query,
* поскольку не имеет суффикса _after.
*/
function user_node_query_($Node){
$CI =& get_instance();
$CI->db
->select('user.name,user.url_name,user.avatar')
->join('users','node.aid = users.id','inner');
}
...
Новые функции Active Record
Обратите внимание на созданный нами метод swop, который позволяет переключаться между цепочками условий Active Record. Он помогает избежать конфликтных ситуаций при их возникновении.$this->db->select('users.*',FALSE)->from('users')->where('id',$id);
// Выстроенная цепочка выглядит так:
// SELECT users.* FROM users WHERE id = "$id"
// Появилась необходимость узнать количество сообщений у пользователя.
$this->db->swop();
// Прошлая цепочка хранится в запасе, новая пока пустая.
$pm_count = $this->db->where('uid',$id)->count_all_results('pm');
// Новая цепочка обнуляется после вызова метода count_all_results.
// Возвращаемся к предыдущей цепочке и завершаем запрос.
$user = $this->db->swop()->get();
// Исходная цепочка обнуляется
По-умолчанию метод «count_all_results» обнуляет цепочку запроса после получения результат, поэтому мы внесли дополнительный параметр, позволяющий ее сохранить.
...
function show_nodes($page = 0){
// Вызываем метод модели ноды, составляющий запрос.
$this->node->query();
// Получаем количество страниц для навигации.
$pager = $this->pager($page,$this->db->count_all_results('nodes',FALSE));
// При указании FALSE вторым аргументом мы сохраняем исходную цепочку запроса
$nodes = $this->db->get('nodes',$pager['start'],$pager['limit'])->result();
...
}
Совет: Рекомендуем использовать Active Record, что позволит сократить расходы при переходе на другие типы баз данных.
