активная запись codeigniter получает запрос и запрос без предложения LIMIT - PullRequest
16 голосов
/ 14 сентября 2011

я использую активную запись, все работает нормально, но я хочу установить $ 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;
}    

Ответы [ 4 ]

39 голосов
/ 14 сентября 2011

Вы можете использовать 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;
1 голос
/ 20 марта 2015

Я бы фактически предложил использовать кеширование запросов КИ.

Чтобы использовать это, вы запускаете кеш, строите запрос без ограничений.Запустите ваш запрос, чтобы получить полный счет, затем примените лимит и запустите запрос, чтобы получить список для вашей страницы с необходимым смещением.

Кэш будет помнить переменные, которые были определены.

Затем можно очистить кэш для последующих запросов.

Пример

    $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();
1 голос
/ 15 сентября 2011

Попробуйте это:

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;
}    
0 голосов
/ 30 марта 2012
$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'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...