Класс Query Builder
CodeIgniter предоставляет доступ к классу Query Builder. Этот шаблон позволяет извлекать, вставлять и обновлять информацию в вашей базе данных с минимальным количеством кода. В некоторых случаях для выполнения действия с базой данных достаточно одной или двух строк кода. CodeIgniter не требует, чтобы каждая таблица базы данных имела собственный класс файла. Вместо этого он предоставляет более упрощенный интерфейс.
Помимо простоты, основное преимущество использования возможностей Query Builder заключается в том, что он позволяет создавать независимые от базы данных приложения, так как синтаксис запроса генерируется каждым адаптером базы данных. Он также позволяет создавать более безопасные запросы, так как значения автоматически экранируются системой.
Примечание
Если вы намерены писать собственные запросы, вы можете отключить этот класс в файле конфигурации вашей базы данных, позволяя ядру библиотеки базы данных и адаптеру использовать меньше ресурсов.
- Выбор данных
- Поиск конкретных данных
- Поиск похожих данных
- Сортировка результатов
- Ограничение или подсчет результатов
- Группировка запросов
- Вставка данных
- Обновление данных
- Удаление данных
- Цепочечное вызов методов
- Кэширование Query Builder
- Сброс Query Builder
- Справочник по классу
Выбор данных
Следующие функции позволяют создавать SQL-запросы SELECT.
$this->db->get()
Выполняет запрос выбора и возвращает результат. Может использоваться для извлечения всех записей из таблицы:
$query = $this->db->get('mytable'); // Produces: SELECT * FROM mytable
Второй и третий параметры позволяют задать условия ограничения и смещения:
$query = $this->db->get('mytable', 10, 20);
// Executes: SELECT * FROM mytable LIMIT 20, 10
// (in MySQL. Other databases have slightly different syntax)
Вы заметите, что вышеупомянутая функция присвоена переменной с именем $query, которую можно использовать для отображения результатов:
$query = $this->db->get('mytable');
foreach ($query->result() as $row)
{
echo $row->title;
}
Пожалуйста, посетите страницу функций результата для получения полной информации о генерации результатов.
$this->db->get_compiled_select()
Компилирует запрос выбора, как и $this->db->get(), но не выполняет запрос. Этот метод просто возвращает SQL-запрос в виде строки.
Пример:
$sql = $this->db->get_compiled_select('mytable');
echo $sql;
// Prints string: SELECT * FROM mytable
Второй параметр позволяет указать, будет ли запрос билдера сброшен (по умолчанию он будет сброшен, так же как и при использовании $this->db->get()) :
echo $this->db->limit(10,20)->get_compiled_select('mytable', FALSE);
// Prints string: SELECT * FROM mytable LIMIT 20, 10
// (in MySQL. Other databases have slightly different syntax)
echo $this->db->select('title, content, date')->get_compiled_select();
// Prints string: SELECT title, content, date FROM mytable LIMIT 20, 10
Ключевой момент в приведенном выше примере заключается в том, что второй запрос не использовал $this->db->from() и не передал имя таблицы в первый параметр. Причина этого результата заключается в том, что запрос не был выполнен с помощью $this->db->get(), что приводит к сбросу значений, или же сброшен напрямую с помощью $this->db->reset_query().
$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');
// Executes: 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'); // Produces: SELECT MAX(age) as age FROM members
$this->db->select_max('age', 'member_age');
$query = $this->db->get('members'); // Produces: SELECT MAX(age) as member_age FROM members
$this->db->select_min()
Записывает часть «SELECT MIN(поле)» вашего запроса. Как и select_max(), вы можете дополнительно включить второй параметр для переименования результирующего поля.
$this->db->select_min('age');
$query = $this->db->get('members'); // Produces: SELECT MIN(age) as age FROM members
$this->db->select_avg()
Записывает часть «SELECT AVG(поле)» вашего запроса. Как и select_max(), вы можете дополнительно включить второй параметр для переименования результирующего поля.
$this->db->select_avg('age');
$query = $this->db->get('members'); // Produces: SELECT AVG(age) as age FROM members
$this->db->select_sum()
Записывает часть «SELECT SUM(поле)» вашего запроса. Как и select_max(), вы можете дополнительно включить второй параметр для переименования результирующего поля.
$this->db->select_sum('age');
$query = $this->db->get('members'); // Produces: 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(); // Produces: 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();
// Produces:
// 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');
// Produces: LEFT JOIN comments ON comments.id = blogs.id
Поиск конкретных данных
$this->db->where()
Эта функция позволяет устанавливать условия WHERE с помощью одного из четырех методов:
Примечание
Все значения, переданные в эту функцию, автоматически экранируются, что обеспечивает более безопасные запросы.
-
Простой метод ключ/значение:
$this->db->where('name', $name); // Produces: 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' -
Метод пользовательского ключа/значения:
Вы можете включить оператор в первый параметр, чтобы управлять сравнением:
$this->db->where('name !=', $name); $this->db->where('id <', $id); // Produces: WHERE name != 'Joe' AND id < 45 -
Метод ассоциативного массива:
$array = array('name' => $name, 'title' => $title, 'status' => $status); $this->db->where($array); // Produces: 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); // Produces: WHERE name != 'Joe' OR id > 50
Примечание
or_where() ранее называлась orwhere(), которая была удалена.
$this->db->where_in()
Генерирует запрос WHERE поле IN (‘элемент’, ‘элемент’) соединенный с AND, если это необходимо
$names = array('Frank', 'Todd', 'James');
$this->db->where_in('username', $names);
// Produces: WHERE username IN ('Frank', 'Todd', 'James')
$this->db->or_where_in()
Генерирует запрос WHERE поле IN (‘элемент’, ‘элемент’) соединенный с OR, если это необходимо
$names = array('Frank', 'Todd', 'James');
$this->db->or_where_in('username', $names);
// Produces: OR username IN ('Frank', 'Todd', 'James')
$this->db->where_not_in()
Генерирует запрос WHERE поле NOT IN (‘элемент’, ‘элемент’) соединенный с AND, если это необходимо
$names = array('Frank', 'Todd', 'James');
$this->db->where_not_in('username', $names);
// Produces: WHERE username NOT IN ('Frank', 'Todd', 'James')
$this->db->or_where_not_in()
Генерирует запрос WHERE поле NOT IN (‘элемент’, ‘элемент’) соединенный с OR, если это необходимо
$names = array('Frank', 'Todd', 'James');
$this->db->or_where_not_in('username', $names);
// Produces: OR username NOT IN ('Frank', 'Todd', 'James')
Поиск похожих данных
$this->db->like()
Этот метод позволяет генерировать условия LIKE, полезные для поиска.
Примечание
Все значения, переданные в этот метод, автоматически экранируются.
-
Простой метод ключ/значение:
$this->db->like('title', 'match'); // Produces: WHERE `title` LIKE '%match%' ESCAPE '!'Если вы используете несколько вызовов метода, они будут объединены друг с другом с оператором AND:
$this->db->like('title', 'match'); $this->db->like('body', 'match'); // WHERE `title` LIKE '%match%' ESCAPE '!' AND `body` LIKE '%match% ESCAPE '!'Если вы хотите управлять тем, где размещается символ подстановки (%), вы можете использовать необязательный третий аргумент. Варианты: ‘before’, ‘after’, ‘none’ и ‘both’ (по умолчанию).
$this->db->like('title', 'match', 'before'); // Produces: WHERE `title` LIKE '%match' ESCAPE '!' $this->db->like('title', 'match', 'after'); // Produces: WHERE `title` LIKE 'match%' ESCAPE '!' $this->db->like('title', 'match', 'none'); // Produces: WHERE `title` LIKE 'match' ESCAPE '!' $this->db->like('title', 'match', 'both'); // Produces: WHERE `title` LIKE '%match%' ESCAPE '!' -
Метод ассоциативного массива:
$array = array('title' => $match, 'page1' => $match, 'page2' => $match); $this->db->like($array); // WHERE `title` LIKE '%match%' ESCAPE '!' AND `page1` LIKE '%match%' ESCAPE '!' AND `page2` LIKE '%match%' ESCAPE '!'
$this->db->or_like()
Этот метод идентичен предыдущему, за исключением того, что несколько случаев объединяются оператором OR:
$this->db->like('title', 'match'); $this->db->or_like('body', $match);
// WHERE `title` LIKE '%match%' ESCAPE '!' OR `body` LIKE '%match%' ESCAPE '!'
Примечание
or_like() ранее назывался orlike(), который был удален.
$this->db->not_like()
Этот метод идентичен like(), за исключением того, что он генерирует операторы NOT LIKE:
$this->db->not_like('title', 'match'); // WHERE `title` NOT LIKE '%match% ESCAPE '!'
$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%' ESCAPE '!'
$this->db->group_by()
Позволяет записать часть GROUP BY вашего запроса:
$this->db->group_by("title"); // Produces: GROUP BY title
Вы также можете передать массив нескольких значений:
$this->db->group_by(array("title", "date")); // Produces: GROUP BY title, date
Примечание
group_by() ранее называлась groupby(), которая была удалена.
$this->db->distinct()
Добавляет ключевое слово «DISTINCT» к запросу
$this->db->distinct();
$this->db->get('table'); // Produces: SELECT DISTINCT * FROM table
$this->db->having()
Позволяет записать часть HAVING вашего запроса. Есть 2 возможных синтаксиса: 1 аргумент или 2:
$this->db->having('user_id = 45'); // Produces: HAVING user_id = 45
$this->db->having('user_id', 45); // Produces: HAVING user_id = 45
Вы также можете передать массив нескольких значений:
$this->db->having(array('title =' => 'My Title', 'id <' => $id));
// Produces: HAVING title = 'My Title', id < 45
Если вы используете базу данных, для которой CodeIgniter экранирует запросы, вы можете предотвратить экранирование содержимого, передав необязательный третий аргумент и установив его в значение FALSE.
$this->db->having('user_id', 45); // Produces: HAVING `user_id` = 45 in some databases such as MySQL
$this->db->having('user_id', 45, FALSE); // Produces: HAVING user_id = 45
$this->db->or_having()
Идентично having(), только разделяет несколько условий с помощью «ИЛИ».
Сортировка результатов
$this->db->order_by()
Позволяет задать условие ORDER BY.
Первый параметр содержит имя столбца, по которому вы хотите отсортировать результаты.
Второй параметр позволяет задать направление сортировки. Доступные варианты: ASC, DESC и RANDOM.
$this->db->order_by('title', 'DESC');
// Produces: ORDER BY `title` DESC
Вы также можете передать собственную строку в первом параметре:
$this->db->order_by('title DESC, name ASC');
// Produces: ORDER BY `title` DESC, `name` ASC
Или можно сделать несколько вызовов функций, если вам нужны несколько полей.
$this->db->order_by('title', 'DESC');
$this->db->order_by('name', 'ASC');
// Produces: ORDER BY `title` DESC, `name` ASC
Если вы выберете направление RANDOM, то первые параметры будут проигнорированы, если только вы не укажете значение числового семени.
$this->db->order_by('title', 'RANDOM');
// Produces: ORDER BY RAND()
$this->db->order_by(42, 'RANDOM');
// Produces: ORDER BY RAND(42)
Примечание
order_by() ранее назывался orderby(), который был удален.
Примечание
Случайная сортировка в настоящее время не поддерживается в Oracle и по умолчанию будет установлена в ASC.
Ограничение или подсчёт результатов
$this->db->limit()
Позволяет ограничить количество строк, возвращаемых запросом:
$this->db->limit(10); // Produces: LIMIT 10
Второй параметр позволяет установить смещение результата.
$this->db->limit(10, 20); // Produces: LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)
$this->db->count_all_results()
Позволяет определить количество строк в конкретном запросе Active Record. Запросы принимают ограничения Query Builder, такие как where(), or_where(), like(), or_like(), и т.д. Пример:
echo $this->db->count_all_results('my_table'); // Produces an integer, like 25
$this->db->like('title', 'match');
$this->db->from('my_table');
echo $this->db->count_all_results(); // Produces an integer, like 17
Однако этот метод также сбрасывает любые значения полей, которые вы могли передать в select(). Если вам нужно их сохранить, вы можете передать FALSE в качестве второго параметра:
echo $this->db->count_all_results('my_table', FALSE);
$this->db->count_all()
Позволяет определить количество строк в определённой таблице. В первом параметре передайте имя таблицы. Пример:
echo $this->db->count_all('my_table'); // Produces an integer, like 25
Группировка запросов
Группировка запросов позволяет создавать группы условий WHERE, заключая их в скобки. Это позволит создавать запросы со сложными условиями WHERE. Вложенные группы поддерживаются. Пример:
$this->db->select('*')->from('my_table')
->group_start()
->where('a', 'a')
->or_group_start()
->where('b', 'b')
->where('c', 'c')
->group_end()
->group_end()
->where('d', 'd')
->get();
// Generates:
// SELECT * FROM (`my_table`) WHERE ( `a` = 'a' OR ( `b` = 'b' AND `c` = 'c' ) ) AND `d` = 'd'
Примечание
Группы должны быть сбалансированы, убедитесь, что каждый group_start() соответствует group_end().
$this->db->group_start()
Начинает новую группу, добавляя открывающую скобку в условие WHERE запроса.
$this->db->or_group_start()
Начинает новую группу, добавляя открывающую скобку в условие WHERE запроса, добавляя префикс «ИЛИ».
$this->db->not_group_start()
Начинает новую группу, добавляя открывающую скобку в условие WHERE запроса, добавляя префикс «НЕ».
$this->db->or_not_group_start()
Начинает новую группу, добавляя открывающую скобку в условие WHERE запроса, добавляя префикс «ИЛИ НЕ».
$this->db->group_end()
Завершает текущую группу, добавляя закрывающую скобку в условие WHERE запроса.
Вставка данных
$this->db->insert()
Генерирует строку вставки на основе предоставленных данных и выполняет запрос. Вы можете передать в функцию либо массив, либо объект. Вот пример с использованием массива:
$data = array(
'title' => 'My title',
'name' => 'My Name',
'date' => 'My date'
);
$this->db->insert('mytable', $data);
// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
Первый параметр будет содержать имя таблицы, второй — ассоциативный массив значений.
Вот пример с использованием объекта:
/*
class Myclass {
public $title = 'My Title';
public $content = 'My Content';
public $date = 'My Date';
}
*/
$object = new Myclass;
$this->db->insert('mytable', $object);
// Produces: INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')
Первый параметр будет содержать имя таблицы, второй — объект.
Примечание
Все значения автоматически экранируются, что делает запросы безопаснее.
$this->db->get_compiled_insert()
Компилирует запрос вставки так же, как и $this->db->insert(), но не выполняет запрос. Этот метод просто возвращает SQL запрос в виде строки.
Пример:
$data = array(
'title' => 'My title',
'name' => 'My Name',
'date' => 'My date'
);
$sql = $this->db->set($data)->get_compiled_insert('mytable');
echo $sql;
// Produces string: INSERT INTO mytable (`title`, `name`, `date`) VALUES ('My title', 'My name', 'My date')
Второй параметр позволяет установить, будет ли сброшен запрос Query Builder (по умолчанию он сбрасывается — так же, как и $this->db->insert()):
echo $this->db->set('title', 'My Title')->get_compiled_insert('mytable', FALSE);
// Produces string: INSERT INTO mytable (`title`) VALUES ('My Title')
echo $this->db->set('content', 'My Content')->get_compiled_insert();
// Produces string: INSERT INTO mytable (`title`, `content`) VALUES ('My Title', 'My Content')
Главное, что следует заметить в приведенном выше примере, заключается в том, что второй запрос не использовал $this->db->from() и не передавал имя таблицы в первый параметр. Причина, по которой это сработало, состоит в том, что запрос не был выполнен с помощью $this->db->insert(), что сбрасывает значения, или сброшен непосредственно с помощью $this->db->reset_query().
Примечание
Этот метод не работает для пакетных вставок.
$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);
// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')
Первый параметр будет содержать имя таблицы, второй — ассоциативный массив значений.
Примечание
Все значения автоматически экранируются, что делает запросы безопаснее.
Обновление данных
$this->db->replace()
Этот метод выполняет оператор REPLACE, который по сути является стандартным SQL для (необязательного) DELETE + INSERT, используя PRIMARY и UNIQUE ключи как определяющий фактор. В нашем случае, он избавит вас от необходимости реализовывать сложную логику с различными комбинациями вызовов select(), update(), delete() и insert().
Пример:
$data = array(
'title' => 'My title',
'name' => 'My Name',
'date' => 'My date'
);
$this->db->replace('table', $data);
// Executes: REPLACE INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
В приведенном выше примере, если предположить, что поле title является нашим первичным ключом, то если строка, содержащая ‘My title’ в качестве значения title, эта строка будет удалена, а наши новые данные строки её заменят.
Использование метода set() также разрешено, и все поля автоматически экранируются, как и с insert().
$this->db->set()
Эта функция позволяет задавать значения для вставок или обновлений.
Она может быть использована вместо прямой передачи массива данных функциям вставки или обновления:
$this->db->set('name', $name);
$this->db->insert('mytable'); // Produces: 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->where('id', 2);
$this->db->update('mytable'); // gives UPDATE mytable SET field = field+1 WHERE id = 2
$this->db->set('field', 'field+1');
$this->db->where('id', 2);
$this->db->update('mytable'); // gives UPDATE `mytable` SET `field` = 'field+1' WHERE `id` = 2
Вы также можете передать ассоциативный массив в эту функцию:
$array = array(
'name' => $name,
'title' => $title,
'status' => $status
);
$this->db->set($array);
$this->db->insert('mytable');
Или объект:
/*
class Myclass {
public $title = 'My Title';
public $content = 'My Content';
public $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);
// Produces:
//
// UPDATE mytable
// SET title = '{$title}', name = '{$name}', date = '{$date}'
// WHERE id = $id
Или вы можете передать объект:
/*
class Myclass {
public $title = 'My Title';
public $content = 'My Content';
public $date = 'My Date';
}
*/
$object = new Myclass;
$this->db->where('id', $id);
$this->db->update('mytable', $object);
// Produces:
//
// 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');
// Produces:
// 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')
Первый параметр будет содержать имя таблицы, второй — ассоциативный массив значений, третий параметр — ключ where.
Примечание
affected_rows() не даст правильных результатов с этим методом, из-за самой природы его работы. Вместо этого update_batch() возвращает количество затронутых строк.
$this->db->get_compiled_update()
Этот метод работает точно так же, как $this->db->get_compiled_insert(), за исключением того, что он генерирует строку UPDATE SQL вместо строки INSERT SQL.
Для получения дополнительной информации см. документацию по $this->db->get_compiled_insert().
Примечание
Этот метод не работает для пакетных обновлений.
Удаление данных
$this->db->delete()
Генерирует строку SQL DELETE и выполняет запрос.
$this->db->delete('mytable', array('id' => $id)); // Produces: // DELETE FROM mytable // WHERE id = $id
Первый параметр — имя таблицы, второй — условие where. Вы также можете использовать функции where() или or_where() вместо передачи данных во второй параметр функции:
$this->db->where('id', $id);
$this->db->delete('mytable');
// Produces:
// 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 DELETE и выполняет запрос.:
$this->db->empty_table('mytable'); // Produces: DELETE FROM mytable
$this->db->truncate()
Генерирует строку SQL TRUNCATE и выполняет запрос.
$this->db->from('mytable');
$this->db->truncate();
// or
$this->db->truncate('mytable');
// Produce:
// TRUNCATE mytable
Примечание
Если команда TRUNCATE недоступна, truncate() будет выполняться как «DELETE FROM table».
$this->db->get_compiled_delete()
Этот метод работает точно так же, как $this->db->get_compiled_insert() за исключением того, что он генерирует строку SQL DELETE вместо строки INSERT SQL.
Для получения дополнительной информации см. документацию по $this->db->get_compiled_insert().
Цепочки методов
Цепочки методов позволяют упростить синтаксис, соединяя несколько функций. Рассмотрим этот пример:
$query = $this->db->select('title')
->where('id', $id)
->limit(10, 20)
->get('mytable');
Кэширование Query Builder
Хотя это не «настоящий» кэш, Query Builder позволяет сохранять (или «кэшировать») определённые части ваших запросов для повторного использования в более поздней точке выполнения вашего скрипта. Обычно, после завершения вызова Query Builder, вся сохранённая информация сбрасывается для следующего вызова. С кэшированием вы можете предотвратить этот сброс и легко повторно использовать информацию.
Кэшированные вызовы кумулятивны. Если вы выполните 2 кэшированных вызова select(), а затем 2 некэшированных вызова select(), это приведет к 4 вызовам select(). Доступны три функции кэширования:
$this->db->start_cache()
Эта функция должна быть вызвана для начала кэширования. Все запросы Query Builder соответствующего типа (см. ниже поддерживаемые запросы) сохраняются для последующего использования.
$this->db->stop_cache()
Эта функция может быть вызвана для остановки кэширования.
$this->db->flush_cache()
Эта функция удаляет все элементы из кэша Query Builder.
Пример кэширования
Вот пример использования:
$this->db->start_cache();
$this->db->select('field1');
$this->db->stop_cache();
$this->db->get('tablename');
//Generates: SELECT `field1` FROM (`tablename`)
$this->db->select('field2');
$this->db->get('tablename');
//Generates: SELECT `field1`, `field2` FROM (`tablename`)
$this->db->flush_cache();
$this->db->select('field2');
$this->db->get('tablename');
//Generates: SELECT `field2` FROM (`tablename`)
Примечание
Следующие операторы могут быть кэшированы: select, from, join, where, like, group_by, having, order_by
Сброс Query Builder
$this->db->reset_query()
Сброс Query Builder позволяет начать заново с вашим запросом, не выполняя его предварительно с помощью метода, такого как $this->db->get() или $this->db->insert(). Как и методы, которые выполняют запрос, это не сбросит элементы, которые вы кэшировали с помощью Кэширования Query Builder.
Это полезно в ситуациях, когда вы используете Query Builder для генерации SQL (например, $this->db->get_compiled_select()) но затем решаете, например, выполнить запрос:
// Note that the second parameter of the get_compiled_select method is FALSE
$sql = $this->db->select(array('field1','field2'))
->where('field3',5)
->get_compiled_select('mytable', FALSE);
// ...
// Do something crazy with the SQL code... like add it to a cron script for
// later execution or something...
// ...
$data = $this->db->get()->result_array();
// Would execute and return an array of results of the following query:
// SELECT field1, field1 from mytable where field3 = 5;
Примечание
Два вызова get_compiled_select() при использовании функциональности кэширования Query Builder и НЕ сброса запросов приведет к тому, что кэш будет объединен дважды. Это, в свою очередь, например, если вы кэшируете select() - выберет одно и то же поле дважды.
Справочник по классам
-
class CI_DB_query_builder -
-
reset_query() -
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов) Тип возвращаемого значения: CI_DB_query_builder Сбрасывает текущее состояние Query Builder. Полезно, когда вы хотите создать запрос, который может быть отменён в определённых условиях.
-
start_cache() -
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов) Тип возвращаемого значения: CI_DB_query_builder Начинает кэширование Query Builder.
-
stop_cache() -
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов) Тип возвращаемого значения: CI_DB_query_builder Останавливает кэширование Query Builder.
-
flush_cache() -
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов) Тип возвращаемого значения: CI_DB_query_builder Очищает кэш Query Builder.
-
set_dbprefix([$prefix = '']) -
Параметры: - $prefix (строка) – Новое префикс для использования
Возвращает: Используемый префикс БД
Тип возвращаемого значения: строка
Устанавливает префикс базы данных без необходимости повторного подключения.
-
dbprefix([$table = '']) -
Параметры: - $table (строка) – Имя таблицы для добавления префикса
Возвращает: Имя таблицы с префиксом
Тип возвращаемого значения: строка
Добавляет префикс базы данных, если он существует в конфигурации.
-
count_all_results([$table = ''[, $reset = TRUE]]) -
Параметры: - $table (строка) – Имя таблицы
- $reset (логическое значение) – Нужно ли сбрасывать значения для SELECT
Возвращает: Количество строк в результирующем наборе запроса
Тип возвращаемого значения: целое число
Генерирует платформо-специфическую строку запроса, которая подсчитывает все записи, возвращаемые запросом Query Builder.
-
get([$table = ''[, $limit = NULL[, $offset = NULL]]]) -
Параметры: - $table (строка) – Таблица для запроса
- $limit (целое число) – Ограничение LIMIT
- $offset (целое число) – Ограничение OFFSET
Возвращает: Экземпляр CI_DB_result (цепочка методов)
Тип возвращаемого значения: CI_DB_result
Компилирует и выполняет оператор SELECT на основе уже вызванных методов Query Builder.
-
get_where([$table = ''[, $where = NULL[, $limit = NULL[, $offset = NULL]]]]) -
Параметры: - $table (смешанный тип) – Таблица(ы) для извлечения данных; строка или массив
- $where (строка) – Условие WHERE
- $limit (целое число) – Ограничение LIMIT
- $offset (целое число) – Ограничение OFFSET
Возвращает: Экземпляр CI_DB_result (цепочка методов)
Тип возвращаемого значения: CI_DB_result
Аналогично
get(), но также позволяет добавить WHERE непосредственно.
-
select([$select = '*'[, $escape = NULL]]) -
Параметры: - $select (строка) – Часть SELECT запроса
- $escape (логическое значение) – Нужно ли экранировать значения и идентификаторы
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов)
Тип возвращаемого значения: CI_DB_query_builder
Добавляет условие SELECT в запрос.
-
select_avg([$select = ''[, $alias = '']]) -
Параметры: - $select (строка) – Поле для вычисления среднего
- $alias (строка) – псевдоним для имени результата
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов)
Тип возвращаемого значения: CI_DB_query_builder
Добавляет условие SELECT AVG(поле) в запрос.
-
select_max([$select = ''[, $alias = '']])
-
-
from($from) -
Параметры: - $from (mixed) – Имя(на) таблицы; строка или массив
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов)
Тип возвращаемого значения: CI_DB_query_builder
Указывает предложение FROM запроса.
-
join($table, $cond[, $type = ''[, $escape = NULL]]) -
Параметры: - $table (string) – Имя таблицы для соединения
- $cond (string) – Условие JOIN ON
- $type (string) – Тип JOIN
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов)
Тип возвращаемого значения: CI_DB_query_builder
Добавляет предложение JOIN к запросу.
-
where($key[, $value = NULL[, $escape = NULL]]) -
Параметры: - $key (mixed) – Имя поля для сравнения или ассоциативный массив
- $value (mixed) – Если один ключ, сравнивается с этим значением
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Возвращает: Экземпляр DB_query_builder
Тип возвращаемого значения: object
Генерирует часть WHERE запроса. Разделяет несколько вызовов с помощью «AND».
-
or_where($key[, $value = NULL[, $escape = NULL]]) -
Параметры: - $key (mixed) – Имя поля для сравнения или ассоциативный массив
- $value (mixed) – Если один ключ, сравнивается с этим значением
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Возвращает: Экземпляр DB_query_builder
Тип возвращаемого значения: object
Генерирует часть WHERE запроса. Разделяет несколько вызовов с помощью «OR».
-
or_where_in([$key = NULL[, $values = NULL[, $escape = NULL]]]) -
Параметры: - $key (string) – Поле для поиска
- $values (array) – Значения для поиска
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Возвращает: Экземпляр DB_query_builder
Тип возвращаемого значения: object
Генерирует запрос SQL WHERE field IN(‘item’, ‘item’), соединенный с помощью «OR», если необходимо.
-
or_where_not_in([$key = NULL[, $values = NULL[, $escape = NULL]]]) -
Параметры: - $key (string) – Поле для поиска
- $values (array) – Значения для поиска
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Возвращает: Экземпляр DB_query_builder
Тип возвращаемого значения: object
Генерирует запрос SQL WHERE field NOT IN(‘item’, ‘item’), соединенный с помощью «OR», если необходимо.
-
where_in([$key = NULL[, $values = NULL[, $escape = NULL]]]) -
Параметры: - $key (string) – Имя поля для проверки
- $values (array) – Массив целевых значений
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Возвращает: Экземпляр DB_query_builder
Тип возвращаемого значения: object
Генерирует запрос SQL WHERE field IN(‘item’, ‘item’), соединенный с помощью «AND», если необходимо.
-
where_not_in([$key = NULL[, $values = NULL[, $escape = NULL]]]) -
Параметры: - $key (string) – Имя поля для проверки
- $values (array) – Массив целевых значений
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Возвращает: Экземпляр DB_query_builder
Тип возвращаемого значения: object
Генерирует запрос SQL WHERE field NOT IN(‘item’, ‘item’), соединенный с помощью «AND», если необходимо.
-
group_start() -
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов) Тип возвращаемого значения: CI_DB_query_builder Начинает групповое выражение, используя AND для условий внутри него.
-
or_group_start() -
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов) Тип возвращаемого значения: CI_DB_query_builder Начинает групповое выражение, используя OR для условий внутри него.
-
not_group_start() -
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов) Тип возвращаемого значения: CI_DB_query_builder Начинает групповое выражение, используя AND NOT для условий внутри него.
-
or_not_group_start() -
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов) Тип возвращаемого значения: CI_DB_query_builder Начинает групповое выражение, используя OR NOT для условий внутри него.
-
group_end() -
Возвращает: Экземпляр DB_query_builder Тип возвращаемого значения: object Завершает групповое выражение.
-
like($field[, $match = ''[, $side = 'both'[, $escape = NULL]]]) -
Параметры: - $field (string) – Имя поля
- $match (string) – Текстовая часть для сопоставления
- $side (string) – На какую сторону выражения поместить подстановочный знак «%»
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов)
Тип возвращаемого значения: CI_DB_query_builder
Добавляет предложение LIKE к запросу, разделяя несколько вызовов с помощью AND.
-
-
or_like($field[, $match = ''[, $side = 'both'[, $escape = NULL]]]) -
Parameters: - $field (string) – Имя поля
- $match (string) – Текстовая часть для сопоставления
- $side (string) – На какую сторону выражения поместить подстановочный знак ‘%’
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Returns: Экземпляр CI_DB_query_builder (цепочка методов)
Return type: CI_DB_query_builder
Добавляет к запросу предложение LIKE, разделяя несколько классов с помощью OR.
-
not_like($field[, $match = ''[, $side = 'both'[, $escape = NULL]]]) -
Parameters: - $field (string) – Имя поля
- $match (string) – Текстовая часть для сопоставления
- $side (string) – На какую сторону выражения поместить подстановочный знак ‘%’
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Returns: Экземпляр CI_DB_query_builder (цепочка методов)
Return type: CI_DB_query_builder
Добавляет к запросу предложение NOT LIKE, разделяя несколько вызовов с помощью AND.
-
or_not_like($field[, $match = ''[, $side = 'both'[, $escape = NULL]]]) -
Parameters: - $field (string) – Имя поля
- $match (string) – Текстовая часть для сопоставления
- $side (string) – На какую сторону выражения поместить подстановочный знак ‘%’
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Returns: Экземпляр CI_DB_query_builder (цепочка методов)
Return type: CI_DB_query_builder
Добавляет к запросу предложение NOT LIKE, разделяя несколько вызовов с помощью OR.
-
having($key[, $value = NULL[, $escape = NULL]]) -
Parameters: - $key (mixed) – Идентификатор (строка) или ассоциативный массив пар поле/значение
- $value (string) – Искомое значение, если $key является идентификатором
- $escape (string) – Необходимо ли экранировать значения и идентификаторы
Returns: Экземпляр CI_DB_query_builder (цепочка методов)
Return type: CI_DB_query_builder
Добавляет к запросу предложение HAVING, разделяя несколько вызовов с помощью AND.
-
or_having($key[, $value = NULL[, $escape = NULL]]) -
Parameters: - $key (mixed) – Идентификатор (строка) или ассоциативный массив пар поле/значение
- $value (string) – Искомое значение, если $key является идентификатором
- $escape (string) – Необходимо ли экранировать значения и идентификаторы
Returns: Экземпляр CI_DB_query_builder (цепочка методов)
Return type: CI_DB_query_builder
Добавляет к запросу предложение HAVING, разделяя несколько вызовов с помощью OR.
-
group_by($by[, $escape = NULL]) -
Parameters: - $by (mixed) – Поле(я) для группировки; строка или массив
Returns: Экземпляр CI_DB_query_builder (цепочка методов)
Return type: CI_DB_query_builder
Добавляет к запросу предложение GROUP BY.
-
order_by($orderby[, $direction = ''[, $escape = NULL]]) -
Parameters: - $orderby (string) – Поле для сортировки
- $direction (string) – Требуемый порядок - ASC, DESC или random
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Returns: Экземпляр CI_DB_query_builder (цепочка методов)
Return type: CI_DB_query_builder
Добавляет к запросу предложение ORDER BY.
-
limit($value[, $offset = 0]) -
Parameters: - $value (int) – Количество строк, до которого необходимо ограничить результаты
- $offset (int) – Количество строк для пропуска
Returns: Экземпляр CI_DB_query_builder (цепочка методов)
Return type: CI_DB_query_builder
Добавляет к запросу предложения LIMIT и OFFSET.
-
offset($offset) -
Parameters: - $offset (int) – Количество строк для пропуска
Returns: Экземпляр CI_DB_query_builder (цепочка методов)
Return type: CI_DB_query_builder
Добавляет к запросу предложение OFFSET.
-
set($key[, $value = ''[, $escape = NULL]]) -
Parameters: - $key (mixed) – Имя поля или массив пар поле/значение
- $value (string) – Значение поля, если $key является одним полем
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Returns: Экземпляр CI_DB_query_builder (цепочка методов)
Return type: CI_DB_query_builder
Добавляет пары поле/значение, которые будут переданы позже в
insert(),update()илиreplace().
-
insert([$table = ''[, $set = NULL[, $escape = NULL]]]) -
Parameters: - $table (string) – Имя таблицы
- $set (array) – Ассоциативный массив пар поле/значение
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
Returns: TRUE в случае успеха, FALSE в случае неудачи
Return type: bool
Компилирует и выполняет оператор INSERT.
-
insert_batch($table[, $set = NULL[, $escape = NULL[, $batch_size = 100]]]) -
Parameters: - $table (string) – Имя таблицы
- $set (array) – Данные для вставки
- $escape (bool) – Необходимо ли экранировать значения и идентификаторы
- $batch_size (int) – Количество строк для вставки за один раз
Returns: Количество вставленных строк или FALSE в случае неудачи
Return type: mixed
Компилирует и выполняет пакетные
INSERTоператоры.Примечание
Если предоставлено более чем
$batch_sizeстрок, будет выполнено несколькоINSERTзапросов, каждый из которых пытается вставить до$batch_sizeстрок.
-
-
set_insert_batch($key[, $value = ''[, $escape = NULL]]) -
Параметры: - $key (mixed) – Имя поля или массив пар поле/значение
- $value (string) – Значение поля, если $key — единственное поле
- $escape (bool) – Нужно ли экранировать значения и идентификаторы
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов)
Тип возвращаемого значения: CI_DB_query_builder
Добавляет пары поле/значение, которые будут вставлены в таблицу позже с помощью
insert_batch().
-
update([$table = ''[, $set = NULL[, $where = NULL[, $limit = NULL]]]]) -
Параметры: - $table (string) – Имя таблицы
- $set (array) – Ассоциативный массив пар поле/значение
- $where (string) – Условие WHERE
- $limit (int) – Условие LIMIT
Возвращает: TRUE при успехе, FALSE при ошибке
Тип возвращаемого значения: bool
Компилирует и выполняет оператор UPDATE.
-
update_batch($table[, $set = NULL[, $value = NULL[, $batch_size = 100]]]) -
Параметры: - $table (string) – Имя таблицы
- $set (array) – Имя поля или ассоциативный массив пар поле/значение
- $value (string) – Значение поля, если $set — единственное поле
- $batch_size (int) – Количество условий для группировки в одном запросе
Возвращает: Количество обновленных строк или FALSE при ошибке
Тип возвращаемого значения: mixed
Компилирует и выполняет пакет
UPDATEоператоров.Примечание
Если предоставлено более
$batch_sizeпар поле/значение, будут выполнены несколько запросов, каждый из которых обрабатывает до$batch_sizeпар поле/значение.
-
set_update_batch($key[, $value = ''[, $escape = NULL]]) -
Параметры: - $key (mixed) – Имя поля или массив пар поле/значение
- $value (string) – Значение поля, если $key — единственное поле
- $escape (bool) – Нужно ли экранировать значения и идентификаторы
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов)
Тип возвращаемого значения: CI_DB_query_builder
Добавляет пары поле/значение, которые будут обновлены в таблице позже с помощью
update_batch().
-
replace([$table = ''[, $set = NULL]]) -
Параметры: - $table (string) – Имя таблицы
- $set (array) – Ассоциативный массив пар поле/значение
Возвращает: TRUE при успехе, FALSE при ошибке
Тип возвращаемого значения: bool
Компилирует и выполняет оператор REPLACE.
-
delete([$table = ''[, $where = ''[, $limit = NULL[, $reset_data = TRUE]]]]) -
Параметры: - $table (mixed) – Таблица(ы) для удаления; строка или массив
- $where (string) – Условие WHERE
- $limit (int) – Условие LIMIT
- $reset_data (bool) – TRUE для сброса пункта «запись» в запросе
Возвращает: Экземпляр CI_DB_query_builder (цепочка методов) или FALSE при ошибке
Тип возвращаемого значения: mixed
Компилирует и выполняет запрос DELETE.
-
truncate([$table = '']) -
Параметры: - $table (string) – Имя таблицы
Возвращает: TRUE при успехе, FALSE при ошибке
Тип возвращаемого значения: bool
Выполняет оператор TRUNCATE для таблицы.
Примечание
Если используемая платформа базы данных не поддерживает TRUNCATE, вместо этого будет использоваться оператор DELETE.
-
empty_table([$table = '']) -
Параметры: - $table (string) – Имя таблицы
Возвращает: TRUE при успехе, FALSE при ошибке
Тип возвращаемого значения: bool
Удаляет все записи из таблицы с помощью оператора DELETE.
-
get_compiled_select([$table = ''[, $reset = TRUE]]) -
Параметры: - $table (string) – Имя таблицы
- $reset (bool) – Нужно ли сбрасывать текущие значения QB
Возвращает: Компилированная строка SQL-запроса
Тип возвращаемого значения: string
Компилирует оператор SELECT и возвращает его как строку.
-
get_compiled_insert([$table = ''[, $reset = TRUE]]) -
Параметры: - $table (string) – Имя таблицы
- $reset (bool) – Нужно ли сбрасывать текущие значения QB
Возвращает: Компилированная строка SQL-запроса
Тип возвращаемого значения: string
Компилирует оператор INSERT и возвращает его как строку.
-
get_compiled_update([$table = ''[, $reset = TRUE]]) -
Параметры: - $table (string) – Имя таблицы
- $reset (bool) – Нужно ли сбрасывать текущие значения QB
Возвращает: Компилированная строка SQL-запроса
Тип возвращаемого значения: string
Компилирует оператор UPDATE и возвращает его как строку.
-
get_compiled_delete([$table = ''[, $reset = TRUE]]) -
Параметры: - $table (string) – Имя таблицы
- $reset (bool) – Нужно ли сбрасывать текущие значения QB
Возвращает: Компилированная строка SQL-запроса
Тип возвращаемого значения: string
Компилирует оператор DELETE и возвращает его как строку.
-
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/userguide3/database/query_builder.html