Как сбросить / очистить порядок между двумя последовательными запросами в CodeIgniter?

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

и т.д.