Получите помощь, поддержку и профессиональное общение в Клубе CodeIgniter

# CodeIgniter User Guide Version 2.1.3

Search User Guide

# Класс Active Record

Codeigniter использует модифицированную версию паттерна Active Record. Этот паттерн позволяет получать, вставлять и обновлять информацию в вашей базе данных с минимальным объемом кода. В некоторых случаях достаточно пары строк кода для того, чтобы выполнить действие с БД. CodeIgniter не требует, чтобы у каждой таблицы БД был собственный файл с классом. Вместо этого он предоставляет более удобный интерфейс.

Кроме простоты, большим преимуществом использования Active Record является то, что он позволяет создавать приложения, независимые от базы данных, так как свой синтаксис запросов автоматически генерируется для каждого драйвера БД. Также он создает более безопасные запросы, автоматически экранируя значения скобками.

Примечание: Если вы хотите писать запросы руками, вы можете выключить этот класс в конфигурационном файле, что позволит библиотеке ядра и адаптеру использовать меньше ресурсов.

- Выборка данных
- Вставка данных
- Обновление данных
- Удаление данных
- Сцепление методов
- Кеширование Active Record

# Выборка данных

Следующие функции позволяют вам строить SQL-запросы для выборки данных.

Примечание: Если вы используете PHP 5, вы можете использовать сцепление методов для получения более компактного синтаксиса. Спецление методов описано в конце страницы.

## $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);`

Пожалуйста прочтите ниже о функции where() для дополнительной информации.

Примечание: 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
`

Множественные вызовы функции сделают несколько объединений в одном запросе.

Если вы хотите указать тип объединения 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 одним из четырех методов:

Примечание: Все значения, переданные этой функции автоматически экранируются, для генерации более безопасных запросов.

1. Простой метод ключ/значение: `$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'`
2. Специальный метод ключ/значение:

   Вы можете включить оператор в первом параметре для того, чтобы контролировать сравнение:

   `$this->db->where('name !=', $name);
   $this->db->where('id <', $id);
   // Сделает: WHERE name != 'Joe' AND id < 45`
3. Метод ассоциативного массива: `$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);`
4. Специальная строка:

   Вы можете писать запросы вручную:

   `$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.

`$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, полезное для поиска.

Примечание: Все значения, переданные этой функции, будут автоматически экранированы.

1. Простой метод ключ/значение: `$this->db->like('title', 'match');
   // Сделает: WHERE title LIKE '%match%'`

   Если вы используете множественные вызовы, они будут объединены условием AND между ними:

   `$this->db->like('title', 'match');
   $this->db->like('body', 'match');
   // WHERE title LIKE '%match%' AND body LIKE '%match%` Если вы хотите контролировать положение wildcard (%), вы можте использовать третий аргумент. Доступные опции 'before', 'after' and 'both' (по умолчанию). `$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%'`
Если вы не хотите использовать wildcard (%), вы можете передать значение 'none' в третьем параметре функции. `$this->db->like('title', 'match', 'none');
// Сделает: WHERE title LIKE 'match'`
2. Использование ассоциативного массива: `$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();

Эта функция идентична функции 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. Здесь есть 2 возможных синтаксиса, один или два аргумента:

`$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 (в некоторых БД, таких как 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 (в MySQL. Другие БД имеют отличный синтаксис)`

## $this->db->count_all_results();

Позволяет вам определить количество строк в конкретном запросе 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();
// Выведет целое число, например 17`

## $this->db->count_all();

Позволяет сосчитать все строки в таблице. Передайте имя таблицы в первом параметре. Пример:

`echo $this->db->count_all('my_table');
// Выведет целое, например 25`

# Вставка данных

## $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->insert_batch();

Генерирует строку для вставки, основываясь на переданных данных, и запускает запрос на выполнение. Вы также можете передать массив или объект в функцию. Вот пример использования массива:

`$data = array(
array(
'title' => 'My title' ,
'name' => 'My Name' ,
'date' => 'My date'
),
array(
'title' => 'Another title' ,
'name' => 'Another Name' ,
'date' => 'Another date'
)
);
$this->db->insert_batch('mytable', $data);
// Сделает: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')`

Первый параметр содержит имя таблицы, второй — ассоциативный массив со значениями.

Примечание: Все значения автоматически экранируются, для генерации более безопасных запросов.

## $this->db->set();

Эта функция позволяет вам устанавливать значения для последующей вставки или обновления.

Вы можете передавать значения массивом непосредственно в функцию обновления:

`$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->update_batch();

Генерирует строку обновления, основываясь на переданных данных, и запускает запрос. Вы можете передать массив или объект этой функции. Вот пример использования массива:

`$data = array(
array(
'title' => 'My title' ,
'name' => 'My Name 2' ,
'date' => 'My date 2'
),
array(
'title' => 'Another title' ,
'name' => 'Another Name 2' ,
'date' => 'Another date 2'
)
);
$this->db->update_batch('mytable', $data, 'title');
// Сделает:
// UPDATE `mytable` SET `name` = CASE
// WHEN `title` = 'My title' THEN 'My Name 2'
// WHEN `title` = 'Another title' THEN 'Another Name 2'
// ELSE `name` END,
// `date` = CASE
// WHEN `title` = 'My title' THEN 'My date 2'
// WHEN `title` = 'Another title' THEN 'Another date 2'
// ELSE `date` END
// WHERE `title` IN ('My title','Another title')`

Первый параметр содержит имя таблицы, второй — ассоциативный массив значений. Третий параметр содержит ключ.

Примечание: Все значения автоматически экранируются, для генерации более безопасных запросов.

# Удаление данных

## $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();

Генерирует строку SQL и запускает запрос на выполнение. `$this->db->empty_table('mytable');
// Сделает
// DELETE FROM mytable`

## $this->db->truncate();

Генерирует урезающий запрос SQL и запускает его на выполнение.

`$this->db->from('mytable');
$this->db->truncate();
// или
$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.

# Кеширование 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 и set.

Переведено в компании Аринт.