Активировать активную запись codeigniter и запрашивать запрос без предложения LIMIT
im, используя активную запись, все работает нормально, но я хочу установить $data [ "totalres" ] к общим результатам, я имею в виду один и тот же запрос, но без LIMIT
проблема заключается в том, что предыдущие утверждения не срабатывают, когда вы выполняете модификатор запроса, поэтому я не могу даже добавить значение $this- > db- > limit() после получения результатов.
любые идеи? я думаю, что его плохая практика "дублировать" запрос только для этого.
function get_search($start, $numrows, $filter = array())
{
...
$this->db
->select("emp")
->from('emp')
->join('empr', 'empr.b = empr.id', 'left')
->like('code', $code)
->limit($numrows, $start);
...
$q = $this->db->get();
// number of rows WITHOUT the LIMIT X,Y filter
$data["totalres"] = ???????;
if ($q->num_rows() > 0)
{
$data["results"] = $q->result();
} else {
$data["results"] = array();
}
return $data;
}
Ответы
Ответ 1
Вы можете использовать SQL_CALC_FOUND_ROWS
, чтобы получить количество строк, которые были бы возвращены sans- LIMIT
. Обратите внимание на ,FALSE
в строке select
. Это говорит CodeIgniter не пытаться избежать предложения select
с обратными выводами (потому что SQL_CALC_FOUND_ROWS
не является полем, а CodeIgniter этого не понимает).
$this->db
->select("SQL_CALC_FOUND_ROWS emp", FALSE)
->from('emp')
->join('empr', 'empr.b = empr.id', 'left')
->like('code', $code)
->limit($numrows, $start);
$q = $this->db->get();
Затем после запуска этого запроса нам нужно запустить другой запрос, чтобы получить общее количество строк.
$query = $this->db->query('SELECT FOUND_ROWS() AS `Count`');
$data["totalres"] = $query->row()->Count;
Ответ 2
Попробуйте следующее:
function get_search($start, $numrows, $filter = array()){
$tmp= $this->db
->select("emp")
->from('emp')
->join('empr', 'empr.b = empr.id', 'left')
->like('code', $code)
->_compile_select();
$q= $this->db->limit($numrows, $start)->get();
// number of rows WITHOUT the LIMIT X,Y filter
$data["totalres"] = $this->db->query($tmp)->num_rows();
if ($q->num_rows() > 0){
$data["results"] = $q->result();
} else {
$data["results"] = array();
}
return $data;
}
Ответ 3
Я бы предпочел использовать кэширование запросов CIs.
Чтобы использовать это, вы запускаете кеш, создаете запрос без ограничений. Запустите свой запрос, чтобы получить полный счетчик, затем примените лимит и запустите запрос, чтобы получить список для своей страницы со смещением, в котором вы нуждаетесь.
Кэш будет помнить переменные, которые были определены.
Затем вы можете очистить кеш для последующих запросов.
Пример
$this->db->start_cache();
// Where, like, having clauses in here
$this->db->stop_cache();
$count = $this->db->get('table')->num_rows();
$this->db->limit('limit', 'offset');
$result = $this->db->get('table')->result_array();
$this->db->flush_cache();
Ответ 4
$this->db
->select("SQL_CALC_FOUND_ROWS emp", FALSE)
->from('emp')
->join('empr', 'empr.b = empr.id', 'left')
->like('code', $code)
->limit($numrows, $start); $q = $this->db->get();
$query = $this->db->query('SELECT FOUND_ROWS() AS `Count`');
$data["totalres"] = $this->db->get()->row()->Count;
CodeIgniter 2.1.0 не запускается, код ниже будет исправлен.
$query = $this->db->query('SELECT FOUND_ROWS() AS `Count`');
$objCount = $query->result_array();
$data["totalres"] = $objCount[0]['Count'];