2013-01-07 16 views
7

pracuję z najnowszej codeIgniter zwolniony, a ja również pracować z jquerydatatables od datatables.netCodeIgniter count_all_results

Pisałem tę funkcję: https://gist.github.com/4478424 które, jak to działa dobrze. Z wyjątkiem sytuacji, gdy filtruję, używając pola tekstowego, wpisując coś. Sam filtr się dzieje, ale mój licznik jest całkowicie wyłączony.

Próbowałem dodać w $res = $this->db->count_all_results() przed moim get, a to w ogóle przestaje działać. Co muszę teraz zrobić, aby następnie użyć całego zapytania bez numeru limit, aby zobaczyć, ile wierszy całkowitych znajduje się w filtrze wyszukiwania.

Jeśli chcesz zobaczyć jakikolwiek inny kod niż to, co jest w mojej istocie, po prostu zapytaj, a ja to zrobię i opublikuję.

Odpowiedz

18

$this->db->count_all_results() zastępuje $this->db->get() w wywołaniu bazy danych.

I.E. możesz zadzwonić pod numer count_all_results() lub get(), ale nie oba.

Musisz wykonać dwie osobne aktywne połączenia. Jeden, aby przypisać wyniki # i jeden, aby uzyskać rzeczywiste wyniki.

Coś takiego do liczenia:

$this->db->select('id'); 
$this->db->from('table'); 
$this->db->where($your_conditions); 
$num_results = $this->db->count_all_results(); 

A dla rzeczywistego zapytania (które powinny już masz):

$this->db->select($your_columns); 
$this->db->from('table'); 
$this->db->where($your_conditions); 
$this->db->limit($limit); 
$query = $this->db->get(); 
1

$this->db->count_all_results(); 

faktycznie zastępuje:

$this->db->get(); 

Więc nie możesz mieć obu.

Jeśli chcesz mają zarówno dostać i obliczyć wiersze num w tym samym zapytaniu można łatwo to zrobić:

$this->db->from(....); 
$this->db->where(....); 
$db_results = $this->get(); 

$results = $db_results->result(); 
$num_rows = $db_results->num_rows(); 
+2

Musi ograniczyć inne zapytanie więc on nie ciągnie się wszystkiego na raz, co dlatego mój przykład zawiera dwa różne zapytania. Wybór tylko identyfikatora (bardzo szybki) w celu uzyskania # wierszy, a następnie wykonanie "powolnego" zapytania, aby uzyskać wiersze bieżącej strony. – Brendan

5

masz przeczytać na http://ellislab.com/codeigniter/user-guide/database/active_record.html#caching?

Widzę, że próbujesz zrobić paginację, w której potrzebujesz "prawdziwych" wyników, a jednocześnie ograniczasz.

To jest moja praktyka w większości moich kodów robię w CI.

Napisałem powyższe kody bez testowania, ale powinno działać w ten sposób. Robię to we wszystkich moich projektach.

+0

Dzięki @kong jin jie. To rozwiązuje mój problem –

1

Tak naprawdę nie musisz mieć wartości od, możesz podać nazwę tabeli w wynikach count_all, tak jak.

$this->db->count_all_results('table_name'); 
0

Try This

/** 
     * @param $column_name : Use In Choosing Column name 
     * @param $where   : Use In Condition Statement 
     * @param $table_name : Name of Database Table 
     * Description   : Count all results 
     */ 
    function count_all_results($column_name = array(),$where=array(), $table_name = array()) 
    { 
     $this->db->select($column_name); 
     // If Where is not NULL 
     if(!empty($where) && count($where) > 0) 
     { 
      $this->db->where($where); 
     } 
     // Return Count Column 
     return $this->db->count_all_results($table_name[0]);//table_name array sub 0 
    } 

Następnie prostego wywołania metody

Ci się to

$this->my_model->count_all_results(['column_name'],['where'],['table name']);