2009-08-25 3 views
5

큰 데이터 세트 (10 억 개가 넘는 행)가 있습니다. 데이터는 날짜별로 데이터베이스에 분할됩니다. 따라서 쿼리 도구는 모든 쿼리에서 SQL between 절을 지정해야합니다. 그렇지 않으면 모든 파티션을 스캔해야합니다. 그리고 글쎄, 그것은 다시 돌아 오기 전에 시간 초과됩니다."Between dates"가있는 CakePHP 모델

그래서 .. 제 질문은, 파티션 데이터베이스 그게 전부의 필드는 날짜입니다 .. CakePHP를 사용

, 어떻게 내 양식에 날짜 "사이"를 지정할 수 있습니까?

"start_date"및 "end_date"를 양식 자체에서 생각하고 있었지만 두 번째 질문이 생길 수 있습니다. 테이블에 연결된 모델에서 어떻게 유효성을 검사합니까?

답변

0

당신은 날짜 사이의 검색 모델의 사용자 정의 메소드를 작성할 수

function findByDateRange($start,$end){ 
    return $this->find('all',array('date >= '.$start,'data >= .'$end)); 
} 

을 지금까지 확인하는 등, 당신은 두 날짜의 유효성을 검사하는 모델의 beforeValidate() 콜백을 사용할 수 있습니다. 이 here에 대한 자세한 정보.

function beforeValidate(){ 
    if(Validation::date($this->data['Model']['start_date'])){ 
     return false; 
    } 
    if(Validation::date($this->data['Model']['end_date'])){ 
     return false; 
    } 
    return parent::beforeValidate(); 
} 

질문에 대한 답변이 있습니까?

8

것은 내가 제대로 따라하고있는 경우 : 당신은이 날짜를 검증 할 필요가

  • 양식에서 생성 된 쿼리를 찾기 위해

    • 사용자는 시작/종료 날짜를 지정해야합니다, 그래서 예를 들면 :
        하지 세기 멀리 시작 날짜부터 시작 날짜
      • 종료 날짜 이후
      • 종료 날짜
    • 당신은 그들이 멀리 조건 배열 안으로 집어 넣 때 잡아 그들이 더 어려울 것이 날짜를 확인하기 원하기 때문에 유효성 검사 오류가

    (이것은 저장하지 경우에도) 형태 내에 인라인 표시합니다. 나는 개별적으로 이러한 전달하려고 노력하고 나중에 다루는 제안 :

    public function beforeFind() { 
        // perform query validation 
        if ($queryData['dateRange']['end'] < $queryData['dateRange']['start']) { 
         $this->invalidate(
          /* end_date field name */, 
          "End date must be after start date" 
         ); 
         return false; 
        } 
        /* repeat for other validation */ 
        // add between condition to query 
        $queryData['conditions'][] = array(
         'Model.dateField BETWEEN ? AND ?' => array(
          $queryData['dateRange']['start'], 
          $queryData['dateRange']['end'], 
         ), 
        ); 
        unset($queryData['dateRange']); 
        // proceed with find 
        return true; 
    } 
    

    나는 동안 Model::invalidate()를 사용하여 시도하지 않은 : 당신은 희망 beforeFind 필터에서 다른 모든 것을 처리 할 수 ​​있어야합니다

    $this->Model->find('all', array(
        'conditions' => array(/* normal conditions here */), 
        'dateRange' => array(
         'start' => /* start_date value */, 
         'end' => /* end_date value */, 
        ), 
    )); 
    

    find 연산을 수행 할 수 없다. 양식은 FormHelper을 사용하여 만든 경우 양식 필드 옆에 다시 표시해야한다는 아이디어가 있습니다.

    실패한 경우 컨트롤러에서이 유효성 검사를 수행하고 Session::setFlash()을 사용해야 할 수 있습니다. 그렇다면 beforeFind을 제거하고 다른 조건과 함께 BETWEEN 조건 배열을 넣을 수도 있습니다.

  • 1

    지난 20 일 데이터를 찾으려면.

    $this->loadModel('User'); 
        //$this->User->recursive=-1; 
        $data=$this->User->find('all', array('recursive' => 0, 
        'fields' => array('Profile.last_name','Profile.first_name'),'limit' => 20,'order' => array('User.created DESC'))); 
    

    다른 현명한 둘 사이의 날짜

    $start = date('Y-m-d') ; 
         $end = date('Y-m-d', strtotime('-20 day')); 
         $conditions = array('User.created' =>array('Between',$start,$end)); 
         $this->User->find("all",$conditions)