2011-12-07 2 views
0

CodeIgniter를 사용하고 있습니다.CodeIgniter 활성 레코드 캐시를 하나의 객체에만 제한하십시오.

현재 사용자의 모델과 사용자 목록의 모델이 있다고 가정 해 보겠습니다. 내가하지 않으면, $ this-> db-> count_all_results (이 함수는 활성 레코드 함수를 리셋)를 사용하여 다시 적용해야하기 때문에 WHERE 문을 캐싱한다. 나는 물론 $ this-> db-> get ('users')도 필요로한다. 사용자를 필터링 할 사용자 목록 모델

함수는 다음과 같다 :

public function onlyWomen() 
{ 
$this->db->start_cache(); 
$this->db->where('gender', '1'); 
$this->db->stop_cache(); 
} 

문제는 내가 또한 현재 사용자에 대한 모델로 일하고 있다는 것입니다. 나는 현재 사용자 모델로 복사하기 위해 사용자 목록 모델에서 설정 한 캐시를 의심합니다. (현재 사용자 모델로 시작할 때 캐시를 플러시 할 수 없기 때문에 둘 다 동시에 작업하고 있습니다.) 나는 활성 레코드 캐시가 호출 될 때 객체에 있어야한다고 생각했습니다.

이 문제를 어떻게 해결합니까?

는 (내 영어는 나쁘지 않다, 그러나이 복잡한 물건과 나와 함께 어쩌면 객체/클래스, 난 당신이 내 문제 ^^ 이해 희망을 완전히 이해하지)는로드 할 때

답변

1

은 CodeIgniter를 효과적으로 싱글을 만듭니다 클래스에 내장 된 Loader 클래스를 사용합니다 (예 : $this->load->database() 또는 $this->load->model('user') 사용). 이것이 활성 레코드 캐싱이 사용자 목록과 사용자 모델간에 지속되는 이유입니다. 이 문제를 피할 수있는 방법은 없습니다. 솔루션을 구현하려면 코어 파일을 편집해야합니다.

캐싱을 통해 쿼리를 작성하는 메서드를 만드는 대신 쿼리를 작성하고 실행하기위한 메서드를 만드는 것이 어떻습니까?

class Userlist extends CI_Model { 

    public function get_women() 
    { 
     // Build and execute active record query 
     $this->db->where('gender', '1'); 
     $query = $this->db->get('users'); 

     // Return results 
     return $query->results(); 
    } 

} 

편집 : 곳에 절을 지정하는 선택적 매개 변수를 사용하는 예제를 추가 여기에 내가 무엇을 의미하는지의 예입니다.

class Userlist extends CI_Model { 

    public function get_users($gender = false, $limit = false) 
    { 
     // Build active record query 
     if ($gender !== false) { 
      $this->db->where('gender', $gender); 
     } 
     if ($limit !== false) { 
      $this->db->limit($limit); 
     } 

     // Execute query 
     $query = $this->db->get('users'); 

     // Return results 
     return $query->results(); 
    } 

} 

분명히 조금 더 복잡해 질 수는 있지만 일반적인 생각입니다.

+0

3 개의 선택적인 WHERE 문이 있기 때문에 그렇게하지 않습니다. 가능한 모든 조합을 만들려면 8 가지 방법을 사용해야합니다 (내 방식대로 할 때 4 가지 방법). 하지만 답을 주셔서 감사합니다. 제가 할 수있는 최선의 방법은 동시에 모델을 사용하지 않는 것입니다. – Gersom

+0

추가 할 절을 결정하는 선택적 매개 변수를 사용할 수 있습니다. 예를 들어 보겠습니다. – birderic

+0

예비 작업. 나는 당신이 의미하는 것을 이해한다;) 그러나 문제는 어쨌든 WHERE 절을 적용한 후에 count_all_results를 수행하기 때문에 캐싱 함수가 필요하다는 것이다. 활성 레코드 절이 다시 설정됩니다. 하지만 여전히 WHERE 문과 함께 get()을 수행하는 데 한계가 있습니다. (그리고 count_all_results가 아닌 get()에 대한 제한이 필요하기 때문에 이전에 count_all_results를 수행해야합니다) – Gersom

관련 문제