CodeIgniter User Guide Version 2.0.0


Класс 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 одним из четырех методов:

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

  1. Простой способ 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'
  2. Пользовательский метод key/value:

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

    $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 при необходимости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, полезные для создания поиска.

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

  1. Простой метод key/value: $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%
    Если вы хотите контролировать положение вставки (%), вы можете использовать опциональный третий параметр. Доступные опции 'before', 'after' и '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%'
  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();

Эта функция идентична функции выше, за исключением того, что множественные значения будут объединены с 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 и так далее