#php #codeigniter #activerecord
#php #codeigniter #activerecord
Вопрос:
Я пытаюсь вызвать 2 последовательных запроса в CodeIgniter, первый из которых содержит предложение order-by. Проблема в том, что CodeIgniter пытается использовать предложение order-by также и для второго запроса и выдает ошибку.
Код выглядит примерно так:
...
$sql = $this->db->get_where('expenses',array('category_id' => $category_id));
$this->db->order_by("date", "asc");
$data = $sql->result_array();
foreach($data as $expense_rec)
{
$expense_id = $data['expense_id'];
$sql2 = $this->db->get_where('expense_details',array('expense_id' => $expense_id));
$detail_rec = $sql2->result_array();
}
...
Для второго запроса скрипт выдает следующую ошибку:
Unknown column 'date' in 'order clause'
SELECT * FROM (`expense_details`) WHERE `expense_id` = '4' ORDER BY `date` asc
Есть ли способ, которым я могу сбросить порядок следования перед вызовом второго запроса?
Я использую CodeIgniter 1.7
P.S. Я знаю, что могу объединить два запроса в один, но мне любопытно узнать, есть ли способ, чтобы приведенный выше код работал в CodeIgniter.
Ответ №1:
Запуск запроса — это то, что сбрасывает его.
Вы размещаете order_by()
после выполнения запроса, поэтому это не влияет на первоначальный запрос, но он начинает создавать следующий запрос.
вместо…
$sql = $this->db->get_where('expenses',array('category_id' => $category_id));
$this->db->order_by("date", "asc");
$data = $sql->result_array();
сделайте это…
$this->db->order_by("date", "asc");
$sql = $this->db->get_where('expenses',array('category_id' => $category_id));
$data = $sql->result_array();
Комментарии:
1. Спасибо. Я не понимал, что вызов get_where() на самом деле выполнял запрос.
Ответ №2:
Вы можете использовать $this->db->_reset_select()
, чтобы прояснить ситуацию.
Комментарии:
1. На заметку — хотя это и работает, это не рекомендуется, если вы (планируете) обновлять свою версию CodeIgniter, поскольку это частная функция (отсюда и начальный символ подчеркивания) и может быть недоступна в будущих версиях.
Ответ №3:
Я столкнулся с аналогичной проблемой. В моем случае я создаю запрос на основе пользовательского ввода. На полпути к построению запроса может возникнуть проблема, которая заставляет меня прекратить построение запроса и выйти из модели. Однако, если после этого вызываются другие модели с другими вызовами Active Record, добавляются ранее созданные запросы, что определенно не входит в мои намерения.
Что я сделал для решения этой проблемы, так это скопировал объект DB в новую переменную и использовал это для построения моего запроса. Эта переменная в любом случае существует только внутри этой модели, поэтому уничтожается до того, как она сможет повлиять на другие модели. Итак:
$new_db = $this->db;
$new_db->where('user_status', 1);
и т.д.