Класс Active Record
CodeIgniter использует модифицированную версию паттерна Active Record. Этот паттерн позволяет получать информацию, вставлять и обновлять вашу базу данных с минимальным количеством кода. В некоторых случаях достаточно двух строк кода для того, чтобы осуществить действие с БД. CodeIgniter не требует, чтобы каждая таблица базы имела собственный файл класса. Вместо этого он предоставляет более простой интерфейс.
Помимо простоты, основное преимущество использования Active Record заключается в том, что он позволяет создавать базы данных независимых приложений, так как синтаксис запроса генерируется адаптером для каждой базы данных. Также он делает запросы безопасными, автоматически экранируя все запросы.
Примечание: Если вы намерены писать собственные запросы, вы можете отключить этот класс в конфигурационном файле БД, что позволит основной библиотеке БД использовать меньше ресурсов
Выборка данных
Следующие функции позволяют вам построить запрос SQL SELECT.
Примечание: Если вы используете PHP5, вы можете использовать метод сцепления для более компактного синтаксиса. Он описан внизу этой страницы.
$this->db->get();
Запускает запрос на выборку и возвращает результат. Может быть использован самостоятельно, чтобы получить все записи из таблицы:
$query = $this->db->get('mytable');
// Делает: SELECT * FROM mytable
Второй и третий параметры позволяют указывать лимит и смещение:
$query = $this->db->get('mytable', 10, 20);
// Делает: SELECT * FROM mytable LIMIT 20, 10 (в MySQL. Другие базы данных могут иметь несколько другой синтаксис)
Обратите внимание, что результат функции выше присваивается переменной $query, которую можно использовать для отображения результата:
$query = $this->db->get('mytable');
foreach ($query->result() as $row)
{
echo $row->title;
}
Посетите страницу Функции результата для более полного описания.
$this->db->get_where();
Идентично функции выше, за исключением того, что это позволяет вам добавлять условие "where" вторым параметром, вместо использования функции db->where():
$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);
Примечание: get_where() ранее была известна как getwhere(), которая теперь удалена
$this->db->select();
Позволяет вам указать часть SELECT вашего запроса:
$this->db->select('title, content, date');
$query = $this->db->get('mytable');
// Производит: SELECT title, content, date FROM mytable
Примечание: Если вы делаете выборку всех столбцов (*) таблицы, вы не должны использовать эту функцию. Если вы опустите это, CodeIgniter предположит, что вы желаете сделать SELECT *
$this->db->select() принимает второй опциональный параметр. Если вы установите его в FALSE, CodeIgniter не будет пытаться защитить ваше поле или имя таблицы обратными кавычками. Это полезно, если вы нуждаетесь в указании составного параметра.
$this->db->select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid', FALSE);
$query = $this->db->get('mytable');
$this->db->select_max();
Записывает часть запроса "SELECT MAX(field)". Опционально вы можете включить второй параметр, чтобы переименовать результирующее поле.
$this->db->select_max('age');
$query = $this->db->get('members');
// Производит: SELECT MAX(age) as age FROM members
$this->db->select_max('age', 'member_age');
$query = $this->db->get('members');
// Производит: SELECT MAX(age) as member_age FROM members
$this->db->select_min();
Записывает часть запроса "SELECT MIN(field)". Как и с select_max(), вы можете указать второй параметр, для переименования результирующего поля.
$this->db->select_min('age');
$query = $this->db->get('members');
// Производит: SELECT MIN(age) as age FROM members
$this->db->select_avg();
Записывает часть запроса "SELECT AVG(field)". Как и с select_max(), вы можете указать второй параметр, для переименования результирующего поля.
$this->db->select_avg('age');
$query = $this->db->get('members');
// Производит: SELECT AVG(age) as age FROM members
$this->db->select_sum();
Записывает "SELECT SUM(field)" часть вашего запроса. Как и с select_max(), вы можете указать второй параметр, для переименования результирующего поля.
$this->db->select_sum('age');
$query = $this->db->get('members');
// Производит: SELECT SUM(age) as age FROM members
$this->db->from();
Позволяет вам записать FROM часть вашего запроса:
$this->db->select('title, content, date');
$this->db->from('mytable');
$query = $this->db->get();
// Производит: SELECT title, content, date FROM mytable
Примечание: Как показано ранее, часть FROM может быть указана в функции $this->db->get(), поэтому используйте метод, который более удобен для вас.
$this->db->join();
Позволяет вам записывать JOIN часть вашего запроса:
$this->db->select('*');
$this->db->from('blogs');
$this->db->join('comments', 'comments.id = blogs.id');
$query = $this->db->get();
// Производит:
// SELECT * FROM blogs
// JOIN comments ON comments.id = blogs.id
Множественные вызовы функций могут быть выполнены, если вы хотите сделать неколько объединений (joins) в одном запросе.
Если вы нуждаетесь в указании типа JOIN, вы можете указать его третьим параметром функции. Доступные опции: left, right, outer, inner, left outer и right outer.
$this->db->join('comments', 'comments.id = blogs.id', 'left');
// Производит: LEFT JOIN comments ON comments.id = blogs.id
$this->db->where();
Функция позволяет вам устанавливать условие WHERE одним из четырех методов:
Примечание: Все переменные, передающиеися этой функции, автоматически экранируются, для генерации более безопасных запросов.
- Простой способ key/value:
$this->db->where('name', $name);
// Производит: WHERE name = 'Joe'Обратите внимание на добавленный знак равенства.
Если вы используете множественные вызовы функции, фрагменты будут сцеплены вместе с AND между ними:
$this->db->where('name', $name);
$this->db->where('title', $title);
$this->db->where('status', $status);
// WHERE name = 'Joe' AND title = 'boss' AND status = 'active' - Пользовательский метод key/value:
Вы можете включить оператор в первый параметр, для того, чтобы контролировать сравнение:
$this->db->where('name !=', $name);
$this->db->where('id <', $id);
// Производит: WHERE name != 'Joe' AND id < 45 - Использование ассоциативного массива:
$array = array('name' => $name, 'title' => $title, 'status' => $status);
$this->db->where($array);
// Производит: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'Вы можете использовать ваши собственные операторы:
$array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);
$this->db->where($array); - Пользовательская строка:
Вы можете написать свои собственные условия вручную:
$where = "name='Joe' AND status='boss' OR status='active'";
$this->db->where($where);
$this->db->where() принимает опциональный третий параметр. Если вы установите его в FALSE, CodeIgniter не будет пытаться защитить имена поля или таблицы обратными кавычками.
$this->db->where('MATCH (field) AGAINST ("value")', NULL, FALSE);
$this->db->or_where();
Эта функция идентична функции выше, за исключением того, что множественные фрагменты будут соединены с OR:
$this->db->where('name !=', $name);
$this->db->or_where('id >', $id);
// Производит: WHERE name != 'Joe' OR id > 50
Примечание: or_where() ранее было известно как orwhere(), которое теперь удалено.
$this->db->where_in();
Генерирует SQL-запрос WHERE field IN ('item', 'item') соединенный с AND при необходимости
$names = array('Frank', 'Todd', 'James');
$this->db->where_in('username', $names);
// Производит: WHERE username IN ('Frank', 'Todd', 'James')
$this->db->or_where_in();
Генерирует SQL-запрос WHERE field IN ('item', 'item') соединенный с OR при необходимости
$names = array('Frank', 'Todd', 'James');
$this->db->or_where_in('username', $names);
// Производит: OR username IN ('Frank', 'Todd', 'James')
$this->db->where_not_in();
Генерирует SQL-запрос WHERE field NOT IN ('item', 'item') соединенный с AND при необходимостиe
$names = array('Frank', 'Todd', 'James');
$this->db->where_not_in('username', $names);
// Производит: WHERE username NOT IN ('Frank', 'Todd', 'James')
$this->db->or_where_not_in();
Генерирует SQL-запрос WHERE field NOT IN ('item', 'item') соединенный с OR при необходимости
$names = array('Frank', 'Todd', 'James');
$this->db->or_where_not_in('username', $names);
// Производит: OR username NOT IN ('Frank', 'Todd', 'James')
$this->db->like();
Эта функция позволяет вам создавать условия LIKE, полезные для создания поиска.
Примечание: Все значения, переданные этой функции, будут автоматически экранированы.
- Простой метод key/value:
$this->db->like('title', 'match');
// Производит: WHERE title LIKE '%match%'Если вы используете множественные вызовы функции, они будут объединены с AND:
$this->db->like('title', 'match');
Если вы хотите контролировать положение вставки (%), вы можете использовать опциональный третий параметр. Доступные опции 'before', 'after' и 'both' (по умолчанию).
$this->db->like('body', 'match');
// WHERE title LIKE '%match%' AND body LIKE '%match%$this->db->like('title', 'match', 'before');
// Производит: WHERE title LIKE '%match'
$this->db->like('title', 'match', 'after');
// Производит: WHERE title LIKE 'match%'
$this->db->like('title', 'match', 'both');
// Производит: WHERE title LIKE '%match%' - Использование ассоциативного массива:
$array = array('title' => $match, 'page1' => $match, 'page2' => $match);
$this->db->like($array);
// WHERE title LIKE '%match%' AND page1 LIKE '%match%' AND page2 LIKE '%match%'
$this->db->or_like();
Эта функция идентична функции выше, за исключением того, что множественные значения будут объединены с OR:
$this->db->like('title', 'match');
$this->db->or_like('body', $match);
// WHERE title LIKE '%match%' OR body LIKE '%match%'
Примечание: or_like() ранее было известно как orlike(), которое теперь удалено.
$this->db->not_like();
Эта функция идентична like(), за исключением того, то она генерирует условия NOT LIKE:
$this->db->not_like('title', 'match');
// WHERE title NOT LIKE '%match%
$this->db->or_not_like();
Эта функция идентична функции выше, за исключением того, что множественные значения будут объединены с OR:
$this->db->like('title', 'match');
$this->db->or_not_like('body', 'match');
// WHERE title LIKE '%match% OR body NOT LIKE '%match%'
$this->db->group_by();
Позволяет вам записывать фрагмент GROUP BY:
$this->db->group_by("title");
// Производит: GROUP BY title
Вы также можете передать массив из множественных значений:
$this->db->group_by(array("title", "date"));
// Производит: GROUP BY title, date
Примечание: group_by() ранее было известно как groupby(), которое теперь удалено.
$this->db->distinct();
Добавляет ключевое слово "DISTINCT" в запрос
$this->db->distinct();
$this->db->get('table');
// Производит: SELECT DISTINCT * FROM table
$this->db->having();
Позволяет вам записать фрагмент HAVING в ваш запрос. Есть два доступных варианта синтаксиса, один аргумент или два:
$this->db->having('user_id = 45');
// Производит: HAVING user_id = 45
$this->db->having('user_id', 45);
// Производит: HAVING user_id = 45
Вы также можете передать массив с множеством значений:
$this->db->having(array('title =' => 'My Title', 'id <' => $id));
// Производит: HAVING title = 'My Title', id < 45
Если вы используете базу данных, для которой CodeIgniter экранирует запросы, вы можете запретить экранирование передачей третьего параметра, в FALSE.
$this->db->having('user_id', 45);
// Производит: HAVING `user_id` = 45 in some databases such as MySQL
$this->db->having('user_id', 45, FALSE);
// Производит: HAVING user_id = 45
$this->db->or_having();
Идентчно having(), только множественные значения разделаются "OR".
$this->db->order_by();
Позволяет вам устанавливать условие сортировки ORDER BY. Первый параметр содержит имя столбца, по которому нужно отсортировать результат. Второй параметр позволяет указывать направление сортировки, asc, desc или random.
$this->db->order_by("title", "desc");
// Производит: ORDER BY title DESC
Вы также можете передать вашу собственную строку первым параметром:
$this->db->order_by('title desc, name asc');
// Производит: ORDER BY title DESC, name ASC
множественные вызовы функции укажут на множественные поля.
$this->db->order_by("title", "desc");
$this->db->order_by("name", "asc");
// Производит: ORDER BY title DESC, name ASC
Примечание: order_by() ранее было известно как orderby(), которое теперь удалено.
Примечание: случайная (random) сортировка не поддерживается Oracle и MSSQL. У них значение по умолчанию 'ASC'.
$this->db->limit();
Позволяет вам указывать ограничение на количество строк, которое будет возвращено запросом:
$this->db->limit(10);
// Производит: LIMIT 10
Второй параметр позволяет указать смещение.
$this->db->limit(10, 20);
// Производит: LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)
$this->db->count_all_results();
Позволяет вам определить количество строк в конкретном запросе Active Record. Запросы будут учитывать ограничители Active Record, такие как where(), or_where(), like(), or_like() и так далее. Пример:
echo $this->db->count_all_results('my_table');
// Дает целое число, например 25
$this->db->like('title', 'match');
$this->db->from('my_table');
echo $this->db->count_all_results();
// Дает целое число, например 27
$this->db->count_all();
Позволяет вам определить количество строк в конкретной таблице. Передайте имя таблицы в первом параметре. Пример:
echo $this->db->count_all('my_table');
// Выведет целое, например 78
Вставка данных
$this->db->insert();
Генерирует строку для вставки, основываясь на предоставленных данных, и запускает запрос на выполнение. Вы также можете передать массив или объект этой функции. Вот пример использования массива:
$data = array(
'title' => 'My title' ,
'name' => 'My Name' ,
'date' => 'My date'
);
$this->db->insert('mytable', $data);
// Производит: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
Первый параметр содержит имя таблицы, второй — ассоциативный массив со значениями.
Вот пример использования объекта:
/*
class Myclass {
var $title = 'My Title';
var $content = 'My Content';
var $date = 'My Date';
}
*/
$object = new Myclass;
$this->db->insert('mytable', $object);
// Производит: INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')
Первый параметр будет содержать имя таблицы, второй — ассоциативный массив со значениями.
Примечание: Все значения автоматически экранируются для получения более безопасных запросов.
$this->db->set();
Эта функция позволяет вам устанавливать значения для вставок или обновлений.
Это может быть использовано для передачи массива данных прямо в функции insert или update:
$this->db->set('name', $name);
$this->db->insert('mytable');
// Производит: INSERT INTO mytable (name) VALUES ('{$name}')
Если вы используете множественные вызовы функций, они будут собраны в зависимости от того, делаете ли вы вставку или обновление:
$this->db->set('name', $name);
$this->db->set('title', $title);
$this->db->set('status', $status);
$this->db->insert('mytable');
set() также принимает третий опциональный параметр ($escape), который запретит экранирование данных, если его установить в FALSE. Для иллюстрирования различий, вот функция set() использована дважды с экранированием и без него.
$this->db->set('field', 'field+1', FALSE);
$this->db->insert('mytable');
// дает INSERT INTO mytable (field) VALUES (field+1)
$this->db->set('field', 'field+1');
$this->db->insert('mytable');
// дает INSERT INTO mytable (field) VALUES ('field+1')
Также вы можете передать ассоциативный массив этой функции:
$array = array('name' => $name, 'title' => $title, 'status' => $status);
$this->db->set($array);
$this->db->insert('mytable');
или объект:
/*
class Myclass {
var $title = 'My Title';
var $content = 'My Content';
var $date = 'My Date';
}
*/
$object = new Myclass;
$this->db->set($object);
$this->db->insert('mytable');
Обновление данных
$this->db->update();
Генерирует строку обновления и запускает запрос, основываясь на предоставленных данных. Вы можете передать массив или объект этой функции. Вот пример использования массива:
$data = array(
'title' => $title,
'name' => $name,
'date' => $date
);
$this->db->where('id', $id);
$this->db->update('mytable', $data);
// Делает:
// UPDATE mytable
// SET title = '{$title}', name = '{$name}', date = '{$date}'
// WHERE id = $id
также вы можете передать объект:
/*
class Myclass {
var $title = 'My Title';
var $content = 'My Content';
var $date = 'My Date';
}
*/
$object = new Myclass;
$this->db->where('id', $id);
$this->db->update('mytable', $object);
// Делает:
// UPDATE mytable
// SET title = '{$title}', name = '{$name}', date = '{$date}'
// WHERE id = $id
Примечание: Все значения будут автоматически экранированы, для получения более безопасных запросов.
Обратите внимание, что использование функции $this->db->where() позволяет вам устанавливать условие WHERE. Вы можете опционально передать информацию прямо в функцию обновления строкой:
$this->db->update('mytable', $data, "id = 4");
или массивом:
$this->db->update('mytable', $data, array('id' => $id));
Вы также можете использовать функцию $this->db->set(), описанную выше, перед выполнением обновления.
Удаление данных
$this->db->delete();
Генерирует строку удаления SQL и запускает выполнение запроса.
$this->db->delete('mytable', array('id' => $id));
// Производит:
// DELETE FROM mytable
// WHERE id = $id
Первый параметр — это имя таблицы, второй — условие WHERE. Вы также можете использовать функции where() или or_where() вместо передачи данных вторым параметром функции:
$this->db->where('id', $id);
$this->db->delete('mytable');
// Производит:
// DELETE FROM mytable
// WHERE id = $id
Массив имен таблиц может быть передан в delete(), если вы хотите удалить данные более, чем из одной таблицы.
$tables = array('table1', 'table2', 'table3');
$this->db->where('id', '5');
$this->db->delete($tables);
Если вы хотите удалить все данные в таблице, вы можете использовать функцию truncate() или empty_table().
$this->db->empty_table();
Генерирует строку удаления и запукает запрос. $this->db->empty_table('mytable');
// Делает
// DELETE FROM mytable
$this->db->truncate();
Генерирует строку вырезания и запукает запрос.
$this->db->from('mytable');
$this->db->truncate();
// or
$this->db->truncate('mytable');
// Делает:
// TRUNCATE mytable
Примечание: Если команда TRUNCATE недоступна, truncate() будет выполнена как "DELETE FROM table".
Сцепление методов
Сцепление методов позволяет вам упростить синтаксис, посредством соединения нескольких функций. Рассмотрим пример:
$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);
$query = $this->db->get();
Примечание: Сцепление методов работает только в PHP 5.
Этот прием, как и многие другие из CodeIgniter, позволяет очень существенно сократить время разработки.Кеширование Active Record
Это на "настоящее" кеширование. Active Record позволяет вам сохранить (или "кешировать") определенные части ваших запросов для повторного использования в другой точке выполнения вашего скрипта. Обычно, когда вызов Active Record завершен, вся сохраненная информация сбрасывается. С кешированием вы можете запретить сброс, и просто повторно использовать информацию.
Вызовы кеширования кумулятивны. Если вы выполнили два кешированных вызова select(), и затем два некешированных вызова select(), произойдет вызов четырех select(). Здесь доступны три функции кеширования:
$this->db->start_cache()
Эта функция должна быть вызвана перед кешированием. Все правильные запросы Active Record (смотрите выше - поддерживаемые запросы) сохраняются для использования позднее.
$this->db->stop_cache()
Эта функция может быть вызвана для остановки кеширования.
$this->db->flush_cache()
Эта функция удаляет все элементы из кеша Active Record.
Вот пример использования:
$this->db->start_cache();
$this->db->select('field1');
$this->db->stop_cache();
$this->db->get('tablename');
// Производит: SELECT `field1` FROM (`tablename`)
$this->db->select('field2');
$this->db->get('tablename');
// Производит: SELECT `field1`, `field2` FROM (`tablename`)
$this->db->flush_cache();
$this->db->select('field2');
$this->db->get('tablename');
// Производит: SELECT `field2` FROM (`tablename`)
Примечание: Следующие заявления могут быть кешированы: select, from, join, where, like, group_by, having, order_by и так далее