Intereting Posts
Как передать значение внутри модели для проверки в правилах Правильное формирование URL-адресов с помощью строки запроса и символа «хэштаг» Как сопоставить динамический массив полей ввода Возвращаемое значение для браузера, но все еще обрабатывается в PHP Как объединить 2 ассоциативных массива в php, чтобы мы не перезаписывали любые повторяющиеся записи во всех случаях? не удалось открыть поток: Ошибка таймаута соединения – Themoviedb Как я могу использовать PHP IDE для контейнеров для инъекций зависимостей? почта отправляется в папку спама вместо почтового ящика Ошибка Mysql & PHP: количество столбцов не соответствует количеству значений в строке 1 Список изображений из каталога по функциям Php, как издеваться над экземпляром объекта? Как разместить массив с использованием AJAX для PHP? Как передать данные POST в PHP-CGI? Модуль Magento хорошо работает на локальном хосте, но не на реальном сервере API-интерфейсы Google v4 Создать лист и пригласить пользователей

Codeigniter Active Record – количество найденных строк с ограничением (MySQL)

Я использую сложный SQL-запрос в модели Codeigniter с применяемым пределом. Я хотел бы подсчитать общее количество строк, которые были бы найдены, если предел и смещение не были применены.

Я хотел бы вернуть счетчик вместе с массивом результатов моему контроллеру – как мне это сделать? Где я могу поместить SQL_CALC_FOUND_ROWS, если это правильное решение?

Вот запрос (который я сам не создавал):

$this->db ->select('table1.* ,table2.* ,table3.* ,table4.* ,table5.* ,table6.* ,table7.* ,table8.* ,table9.* ,(SELECT GROUP_CONCAT(field1) FROM table10 WHERE table10.field3 = table9.field2) as categories ,(SELECT GROUP_CONCAT(field1) FROM table5 WHERE table5.field11 = table4.field12 AND table4.field21 = 0 AND table5.field1 != 0) as categories2 ,(SELECT AVG(table11.field4) FROM table11 WHERE table11.field6 = table9.field2) as rating ,(SELECT COUNT(table12.field5) FROM table12 WHERE table12.field7 = table9.field2) as rated_times') ->from('table9') ->join('table10', 'table10.field3 = table9.field2') ->join('categories', 'categories.field1 = table10.field1') ->join('table3', 'table3.field8 = table9.field2') ->join('table1', 'table1.id = table9.field2') ->join('table2', 'table2.field9 = table9.field2 AND table2.field19 = 1', 'left') ->join('table4', 'table4.field10 = table9.field2 AND table4.field21 = 0', 'left') ->join('table5', 'table5.field11 = table4.field12 AND table5.field1 != 0', 'left') ->join('table6', 'table6.field13 = table9.field2 AND table6.field22 BETWEEN SYSDATE() - INTERVAL 90 DAY AND SYSDATE()', 'left') ->join('table7', 'table7.field14 = table9.field2', 'left') ->join('table8', 'table8.field15 = table9.field2', 'left') ->where('table1.field16', NULL) ->where($where_clause_1, null, FALSE) ->where('table9.field17', $searchArray['search_country']) ->or_where($or_where_clause_2, null, FALSE) ->or_where($or_where_clause_3, null, FALSE) ->or_where($or_where_clause_4, null, FALSE) ->or_where($or_where_clause_5, null, FALSE) ->or_where($or_where_clause_6, null, FALSE) ->or_where($or_where_clause_7, null, FALSE) ->like('table9.field17', $searchArray['search_country']) ->order_by('table3.field18', 'ASC') ->order_by('table2.field19', 'DESC') ->order_by('table1.field20', 'DESC') ->group_by('table9.field2') ->limit($limit, $offset); $data = $this->db->get(); return $data->result_array(); 

Радуйся за любую помощь!

Related of "Codeigniter Active Record – количество найденных строк с ограничением (MySQL)"

У меня ранее было то же самое требование для разбивки на страницы, и я смог заставить его работать с помощью CodeIgniter Active Record.

Сначала установите параметр SQL_CALC_FOUND_ROWS как псевдо-столбец в вашем заявлении select и установите escape-запрос в false:

 $this->db->select('SQL_CALC_FOUND_ROWS null as rows, other columns ...',FALSE); 

Затем, после выполнения запроса с ограничением и смещением, назначьте результирующий набор в возвращаемый массив:

 $data = $this->db->get(); $return['results'] = $data->result(); // Do something with the results 

Наконец, запустите второй запрос, чтобы получить найденные строки, а также назначьте это возвращаемому массиву. Я использую метод цепочки здесь, чтобы сделать все это за один шаг.

 $return['rows'] = $this->db->query('SELECT FOUND_ROWS() count;')->row()->count; 

И верните массив результатов и строк.

 return $return; 

Один из способов, я могу думать, это иметь переменную $ count при вызове вашей функции, и она будет выглядеть примерно так:

function your_function ($ count = FALSE) {

 $this->db->select(...) //before limit you do this: if($count != FALSE): return $this->db->get->result_array() else : return $this->db->limit($limit, $offset)->get()->result_array(); endif; } 

Таким образом, вы можете вызывать функцию два раза – одно для count и другое для запроса предела:

 $count = count($this->your_function(TRUE)); $data['query] = $this->your_function();