Работа с БД: класс Active Record

 

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

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

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

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

Следующие функции позволяют вам получать SELECT-запросы.
Примечание: если вы используете PHP 5, то вы можете применять цепочки вызовов методов для получения более компактного синтаксиса кода. Подробнее этот вопрос описан в конце данной страницы.

$this->db->get();

Выполняет запрос и возвращает результат. Может быть использован для получения всех записей в таблице:

  1. $query = $this->db->get('mytable');
  2.  
  3. // Запрос: SELECT * FROM mytable

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

  1. $query = $this->db->get('mytable', 10, 20);
  2.  
  3. // Запрос: SELECT * FROM mytable LIMIT 20, 10 (для MySQL. Другие БД могут иметь немного другой синтаксис запроса)

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

  1. $query = $this->db->get('mytable');
  2.  
  3. foreach ($query->result() as $row)
  4. {
  5. echo $row->title;
  6. }

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

$this->db->get_where();

Данная функция аналогична предыдущей за исключением того, что в качестве второго параметра передаются условия для WHERE-части запроса, вместо использования функции db->where():

  1. $query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);

Функция where() описана далее на этой странице.
Примечание: функция get_where() ранее называлась getwhere(), прежнее название функции является устаревшим.

$this->db->select();

функция позволяет задать SELECT-часть запроса.

  1. $this->db->select('title, content, date');
  2.  
  3. $query = $this->db->get('mytable');
  4.  
  5. // Запрос: SELECT title, content, date FROM mytable

Примечание: если вы выбираете все поля из таблицы (*), вам не нужно использовать данную функцию. По умолчанию CodeIgniter подразумевает запрос SELECT *

$this->db->select() принимает необязательный второй параметр. Если он установлен в FALSE, CodeIgniter не будет пытаться экранировать названия полей и таблиц. Данный вариант использования функции полезен, если вы используете составные запросы.

  1. $this->db->select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid', FALSE);
  2. $query = $this->db->get('mytable');

$this->db->select_max();

Функция записывает часть запроса "SELECT MAX(field)". Вы можете также указать необязательный второй параметр для того, чтобы переименовать поле в результате запроса.

  1. $this->db->select_max('age');
  2. $query = $this->db->get('members');
  3. // Запрос: SELECT MAX(age) as age FROM members
  4.  
  5. $this->db->select_max('age', 'member_age');
  6. $query = $this->db->get('members');
  7. // Запрос: SELECT MAX(age) as member_age FROM members

$this->db->select_min();

Записывает часть запроса "SELECT MIN(field)". Как и в случае с select_max() вы можете указать название для поля в результате.

  1. $this->db->select_min('age');
  2. $query = $this->db->get('members');
  3. // Запрос: SELECT MIN(age) as age FROM members

$this->db->select_avg();

Записывает часть запроса "SELECT AVG(field)". Как и в случае с select_max() вы можете задать название для поля в результате запроса.

  1. $this->db->select_avg('age');
  2. $query = $this->db->get('members');
  3. // Запрос: SELECT AVG(age) as age FROM members

$this->db->select_sum();

Записывает часть запроса "SELECT SUM(field)". Как и в случае с select_max() вы можете задать название для поля в результате запроса.

  1. $this->db->select_sum('age');
  2. $query = $this->db->get('members');
  3. // Запрос: SELECT SUM(age) as age FROM members

$this->db->from();

Позволяет задать FROM-часть запроса:

  1. $this->db->select('title, content, date');
  2. $this->db->from('mytable');
  3.  
  4. $query = $this->db->get();
  5.  
  6. // Запрос: SELECT title, content, date FROM mytable

Примечание: как уже ранее было сказано, вы можете указывать FROM-часть запроса как первый параметр для функции get(), вы можете использовать любой из способов.

$this->db->join();

Позволяет задать JOIN-часть запроса:

  1. $this->db->select('*');
  2. $this->db->from('blogs');
  3. $this->db->join('comments', 'comments.id = blogs.id');
  4.  
  5. $query = $this->db->get();
  6.  
  7. // Запрос:
  8. // SELECT * FROM blogs
  9. // JOIN comments ON comments.id = blogs.id

Если вам нужно выполнить несколько объединений, вы можете сделать несколько вызвов функции. Если вам нужны отличные от естественного объединения варианты, вы можете задать треьим параметром тип объединения. Допустимые опции: left, right, outer, inner, left outer, right outer.

  1. $this->db->join('comments', 'comments.id = blogs.id', 'left');
  2.  
  3. // В результате: LEFT JOIN comments ON comments.id = blogs.id

$this->db->where();

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

  1. Простой способ ключ/значение
    1. $this->db->where('name', $name);
    2.  
    3. // Результат: WHERE name = 'Joe'

    Обратите внимание, что знак равенства добавлен автоматически. Если вы сделаете несколько вызовов функции, то условия будут объединены операцией AND:

    1. $this->db->where('name', $name);
    2. $this->db->where('title', $title);
    3. $this->db->where('status', $status);
    4.  
    5. // WHERE = name 'Joe' AND title = 'boss' AND status = 'active'
  2. Произвольное задание ключ/значение

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

    1. $this->db->where('name !=', $name);
    2. $this->db->where('id <', $id);
    3.  
    4. // Результат: WHERE name != 'Joe' AND id < 45
  3. Ассоциативный массив параметров
    1. $array = array('name' => $name, 'title' => $title, 'status' => $status);
    2.  
    3. $this->db->where($array);
    4.  
    5. // Результат: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'

    Для этого способа передачи параметров также можно задавать операторы сравнения:

    1. $array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);
    2.  
    3. $this->db->where($array);
  4. Произвольная строка

    Вы также можете задать условия выборки при помощи произвольной строки

    1. $where = "name='Joe' AND status='boss' OR status='active'";
    2.  
    3. $this->db->where($where);

$this->db->where() принимает также опциональный третий параметр. Если он равен FALSE, то CodeIgniter не будет пытаться экранировать имена полей и таблиц.

  1. $this->db->where('MATCH (field) AGAINST ("value")', NULL, FALSE);

$this->db->or_where();

Данная функция идентична предыдущей, за исключением того, что условия будут объединены оператором OR:

  1. $this->db->where('name !=', $name);
  2. $this->db->or_where('id >', $id);
  3.  
  4. // Результат: WHERE name != 'Joe' OR id > 50

Примечание: данная функция ранее называлась orwhere(), прошлое название является устаревшим.

$this->db->where_in();

Генерирует условие WHERE field IN ('item', 'item') и объединяет с другими условиями оператором AND при необходимости

  1. $names = array('Frank', 'Todd', 'James');
  2. $this->db->where_in('username', $names);
  3. // Результат: AND WHERE username IN ('Frank', 'Todd', 'James')

$this->db->or_where_in();

Генерирует условие WHERE field IN ('item', 'item') и объединяет с другими условиями оператором OR при необходимости

  1. $names = array('Frank', 'Todd', 'James');
  2. $this->db->or_where_in('username', $names);
  3. // Результат: OR WHERE username IN ('Frank', 'Todd', 'James')

$this->db->where_not_in();

Генерирует часть запроса WHERE field NOT IN ('item', 'item') и объединяет с другими условиями оператором AND где необходимо.

  1. $names = array('Frank', 'Todd', 'James');
  2. $this->db->where_not_in('username', $names);
  3. // Результат: AND WHERE username NOT IN ('Frank', 'Todd', 'James')

$this->db->or_where_not_in();

Генерирует часть запроса WHERE field NOT IN ('item', 'item') и объединяет с другими условиями оператором OR где необходимо.

  1. $names = array('Frank', 'Todd', 'James');
  2. $this->db->or_where_not_in('username', $names);
  3. // Результат: OR WHERE username NOT IN ('Frank', 'Todd', 'James')

$this->db->like();

Данная функция позволяет задавать LIKE-условия запроса, полезные при запросах поиска.
Примечание: значения переданные в эту функцию автоматически экранируются

  1. Передача пар ключ/значение
    1. $this->db->like('title', 'match');
    2.  
    3. // WHERE title LIKE '%match%'

    Если вы делаете несколько вызовов этой функции для одного запроса, то условия будут объединены оператором AND:

    1. $this->db->like('title', 'match');
    2. $this->db->like('body', 'match');
    3.  
    4. // WHERE title LIKE '%match%' AND body LIKE '%match%

    Если вы хотите контролировать положение символа '%', можно использовать необязательный третий параметр. Возможные заначения: 'before','after' и 'both' (по умолчанию)

    1. $this->db->like('title', 'match', 'before');
    2. // WHERE title LIKE '%match'
    3.  
    4. $this->db->like('title', 'match', 'after');
    5. // WHERE title LIKE 'match%'
    6.  
    7. $this->db->like('title', 'match', 'both');
    8. // WHERE title LIKE '%match%'
  2. Передача аргументов как ассоциативный массив
    1. $array = array('title' => $match, 'page1' => $match, 'page2' => $match);
    2.  
    3. $this->db->like($array);
    4.  
    5. // WHERE title LIKE '%match%' AND page1 LIKE '%match%' AND page2 LIKE '%match%'

$this->db->or_like();

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

  1. $this->db->like('title', 'match');
  2. $this->db->or_like('body', $match);
  3.  
  4. // WHERE title LIKE '%match%' OR body LIKE '%match%'

Примечание: раньше эта функция называлась orlike(), прежнее название является устаревшим.

$this->db->not_like();

Функция аналогична like(), за исключением того, что она генерирует условие NOT LIKE :

  1. $this->db->not_like('title', 'match');
  2.  
  3. // WHERE title NOT LIKE '%match%

$this->db->or_not_like();

Функция идентична not_like(), но результат будет соединен с другими условиями оператором OR:

  1. $this->db->like('title', 'match');
  2. $this->db->or_not_like('body', 'match');
  3.  
  4. // WHERE title LIKE '%match% OR body NOT LIKE '%match%'

$this->db->group_by();

Позволяет задать GROUP BY-часть запроса:

  1. $this->db->group_by("title");
  2.  
  3. // Produces: GROUP BY title

Функция также позволяет передать несколько параметров:

  1. $this->db->group_by(array("title", "date"));
  2.  
  3. // Produces: GROUP BY title, date

Примечание: устаервшее название этой функции - groupby()

$this->db->distinct();

Добавляет в запрос директиву DISTINCT:

  1. $this->db->distinct();
  2. $this->db->get('table');
  3.  
  4. // Produces: SELECT DISTINCT * FROM table

$this->db->having();

Позволяет указать HAVING часть запроса. Существуют два возможных синтаксиса вызова этой функции - с одним и с двумя аргументами:

  1. $this->db->having('user_id = 45');
  2. // HAVING user_id = 45
  3.  
  4. $this->db->having('user_id', 45);
  5. // HAVING user_id = 45

Также функция может принимать множественные параметры:

  1. $this->db->having(array('title =' => 'My Title', 'id <' => $id));
  2.  
  3. // Produces: HAVING title = 'My Title', id < 45

Если вы используете БД для которой CodeIgniter осуществляет экранирование, вы можете отключить экранирование передав в функцию третий необязательный параметр со значением FALSE

  1. $this->db->having('user_id', 45);
  2. // HAVING `user_id` = 45 Для некоторых БД, таких как MySQL
  3. $this->db->having('user_id', 45, FALSE);
  4. // HAVING user_id = 45

$this->db->or_having();

Функция аналогична предыдущей за исключением того, что условие будет соединено с другими при помощи оператора OR

$this->db->order_by();

Позволяет задать ORDER BY часть запроса. Первый параметр содержит имя поля, по которому нужно осуществить сортировку результата. Второй параметр указывает направление сортировки. Он может принимать значения asc, desc и random.

  1. $this->db->order_by("title", "desc");
  2.  
  3. // ORDER BY title DESC

Вы также можете передать строку условия первым параметром:

  1. $this->db->order_by('title desc, name asc');
  2.  
  3. // ORDER BY title DESC, name ASC

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

  1. $this->db->order_by("title", "desc");
  2. $this->db->order_by("name", "asc");
  3.  
  4. // ORDER BY title DESC, name ASC

Примечание: устаревшее название этой функции - orderby()
Примечание: случайный порядок сортировки в настоящее время не доступен для БД Oracle и MSSQL. В данных БД порядок сортировки по умолчанию - ASC.

$this->db->limit();

Позволяет ограничить число строк результата:

  1. $this->db->limit(10);
  2.  
  3. // LIMIT 10

Второй параметр функции позволяет задать смещение результата:

  1. $this->db->limit(10, 20);
  2.  
  3. // LIMIT 20, 10 (в MySQL. Другие БД могут иметь немного другой синтаксис )

$this->db->count_all_results();

Позволяет определить количество строк в результате определенного запроса Active Record. Запрос также может содержать условия выборки, такие как where(), like(), or_like() и т.д.

  1. echo $this->db->count_all_results('my_table');
  2. // Целое число, например 25
  3.  
  4. $this->db->like('title', 'match');
  5. $this->db->from('my_table');
  6. echo $this->db->count_all_results();
  7. // Целое число, например 17

$this->db->count_all();

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

  1. echo $this->db->count_all('my_table');
  2.  
  3. // В результате число, например 25

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

$this->db->insert();

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

  1. $data = array(
  2. 'title' => 'My title' ,
  3. 'name' => 'My Name' ,
  4. 'date' => 'My date'
  5. );
  6.  
  7. $this->db->insert('mytable', $data);
  8.  
  9. // INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')

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

Пример использования объекта:

  1. /*
  2.   class Myclass {
  3.   var $title = 'My Title';
  4.   var $content = 'My Content';
  5.   var $date = 'My Date';
  6.   }
  7. */
  8.  
  9. $object = new Myclass;
  10.  
  11.  
  12.  
  13.  
  14. $this->db->insert('mytable', $object);
  15.  
  16. // INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')

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

Все значения автоматически экранируются, что позволяет получить более безопасные запросы.

$this->db->set();

Функция позволяет установить значения полей для вставки или изменения данных.Она может быть использована вместо передачи массива непосредственно функции вставки или изменения:

  1. $this->db->set('name', $name);
  2. $this->db->insert('mytable');
  3.  
  4. // INSERT INTO mytable (name) VALUES ('{$name}')

Если вы осуществляете несколько вызовов функции, они будут корректно обработаны в зависимости от того, осуществляете ли вы вставку или изменение данных:

  1. $this->db->set('name', $name);
  2. $this->db->set('title', $title);
  3. $this->db->set('status', $status);
  4. $this->db->insert('mytable');

set() также принимает третий необязательный параметр ($escape), который позволяет отменить экранирование данных если установлен в FALSE. Чтобы показать различия, вот пример использования set() с экранированием и без:

  1. $this->db->set('field', 'field+1', FALSE);
  2. $this->db->insert('mytable');
  3. // INSERT INTO mytable (field) VALUES (field+1)
  4.  
  5. $this->db->set('field', 'field+1');
  6. $this->db->insert('mytable');
  7. // INSERT INTO mytable (field) VALUES ('field+1')

Также вы можете передать в функцию ассоциативный массив:

  1. $array = array('name' => $name, 'title' => $title, 'status' => $status);
  2.  
  3. $this->db->set($array);
  4. $this->db->insert('mytable');

или объект:

  1. /*
  2.   class Myclass {
  3.   var $title = 'My Title';
  4.   var $content = 'My Content';
  5.   var $date = 'My Date';
  6.   }
  7. */
  8.  
  9. $object = new Myclass;
  10.  
  11. $this->db->set($object);
  12. $this->db->insert('mytable');

Изменение данных

$this->db->update();

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

  1. $data = array(
  2. 'title' => $title,
  3. 'name' => $name,
  4. 'date' => $date
  5. );
  6.  
  7. $this->db->where('id', $id);
  8. $this->db->update('mytable', $data);
  9.  
  10. //
  11. // UPDATE mytable
  12. // SET title = '{$title}', name = '{$name}', date = '{$date}'
  13. // WHERE id = $id

Пример использования объекта:

  1. /*
  2.   class Myclass {
  3.   var $title = 'My Title';
  4.   var $content = 'My Content';
  5.   var $date = 'My Date';
  6.   }
  7. */
  8.  
  9. $object = new Myclass;
  10.  
  11. $this->db->where('id', $id);
  12. $this->db->update('mytable', $object);
  13.  
  14. //
  15. // UPDATE mytable
  16. // SET title = '{$title}', name = '{$name}', date = '{$date}'
  17. // WHERE id = $id

Все значения автоматически экранируются

Обратите внимание на использование функции $this->db->where(), которая позволяет установить WHERE-часть запроса и задать условия для изменения данных. Вы также можете передать эти условия в функцию update() как строковый параметр:

  1. $this->db->update('mytable', $data, "id = 4");

либо как массив:

  1. $this->db->update('mytable', $data, array('id' => $id));

При выполнении изменения данных вы также можете использовать функцию set(), как было описано выше.

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

$this->db->delete();

Генерирует SQL-строку удаления данных и выполняет запрос.

  1. $this->db->delete('mytable', array('id' => $id));
  2.  
  3. //
  4. // DELETE FROM mytable
  5. // WHERE id = $i

Первый параметр - имя таблицы, второй - условие. Вы также можете использовать функции where() или or_where() вместо передачи второго параметра функции delete():

  1. $this->db->where('id', $id);
  2. $this->db->delete('mytable');
  3.  
  4. //
  5. // DELETE FROM mytable
  6. // WHERE id = $id

Также в функцию delete() может быть передан массив имен таблиц, если вам нужно удалить записи из более чем одной таблицы:

  1. $tables = array('table1', 'table2', 'table3');
  2. $this->db->where('id', '5');
  3. $this->db->delete($tables);

Если вам нужно просто удалить все данные из таблицы, вы можете использовать функции truncate() или empty_table().

$this->db->empty_table();

Генерирует и выполняет SQL-строку удаления данных из таблицы:

  1. $this->db->empty_table('mytable');
  2.  
  3. // DELETE FROM mytable

$this->db->truncate();

Генерирует и выполняет SQL-строку очистки таблицы

  1. $this->db->from('mytable');
  2. $this->db->truncate();
  3. // or
  4. $this->db->truncate('mytable');
  5.  
  6. // TRUNCATE mytable

Примечание: если команда TRUNCATE недоступна в текущей БД, то вместо нее будет использована команда "DELETE FROM table"

Цепочки методов

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

  1. $this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);
  2.  
  3. $query = $this->db->get();

Примечание: цепочки вызова методов доступны только в PHP5.

Кеширование Active Record

Не поддерживая кеширование в полном смысле слова, Active Record позволяет вам сохранить (или "кешировать") определенные части запросов для повторного использования. Обычно, когда запрос Active Recrord выполнен, вся сохраненная информация сбрасывается для выполнения последующих запросов. Используя кеширование, вы можете избежать этой очистки и использовать информацию запроса повторно.

Кешированные вызовы накапливаются. Если вы сделаете 2 кешированных вызова select() и 2 не кешированных вызова select(), то в результате будет сделано 4 вызова select(). Существуют три функции управления кешированием:

$this->db->start_cache()

Эта функция должна быть вызвана чтобы начать кеширование запросов. Все запросы Active Record поддерживаемого типа будут сохранены для повторного использования (ниже будет приведен список поддерживаемых для кеширования запросов).

$this->db->stop_cache()

Данная функция прекращает кеширование запросов.

$this->db->flush_cache()

Функция удаляет кеш запросов Active Record.

Пример использования:

  1. $this->db->start_cache();
  2. $this->db->select('field1');
  3. $this->db->stop_cache();
  4. $this->db->get('tablename');
  5. // Results in:
  6. // SELECT `field1` FROM (`tablename`)
  7.  
  8. $this->db->select('field2');
  9. $this->db->get('tablename');
  10. // Results in:
  11. // SELECT `field1`, `field2` FROM (`tablename`)
  12.  
  13. $this->db->flush_cache();
  14.  
  15. $this->db->select('field2');
  16. $this->db->get('tablename');
  17. // Results in:
  18. // SELECT `field2` FROM (`tablename`)

Примечание: Следующие поля могут быть кешированы: ‘select’, ‘from’, ‘join’, ‘where’, ‘like’, ‘groupby’, ‘having’, ‘orderby’, ‘set’

Присоединяюсь

Присоединяюсь к посту предыдущего автора! Для новичков просто очень нужная информация! Чем больше изучаю этот framework тем больше он мне нравится! :)

http://codeigniter.com/user_g

http://codeigniter.com/user_guide/database/active_record.html

МОЛОДЕЦ

Просто

Просто обалденный пост для начинающих. Спасибо большое!!!

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

CAPTCHA
Этот вопрос предназначен для того, чтобы отсеять ботов
2 + 18 =
Решите простой математический пример и введите результат. К примеру, для вопроса 1+3 нужно ввести 4

Вход в систему

Последние комментарии