2009-08-25 40 views
5

Geniş bir veri kümem var (bir milyardan fazla satır). Veri, tarihe göre veritabanında bölümlenmiştir. Bu nedenle, sorgu aracım her sorguda bir SQL arasında bir SQL belirtmesi ZORUNLUDUR, ya da her bölümü taramak zorunda kalacak .. ve iyi, geri gelmeden önce zaman aşımı olacak.CakePHP Model "Tarihleri ​​arasında"

Yani .. benim sorum, bölümlenmiş veritabanı thats alan bir tarihtir edilir .. CakePHP'yi kullanma

, nasıl benim formda tarihleri ​​"arasında" belirtebilirim?

Formda kendiliğinden "start_date" ve "end_date" yapmayı düşünüyordum, ancak bu bana ikinci bir soru getirebilir .. Bir tabloya bağlı bir modelde bunu nasıl doğrularım?

cevap

0

Sen tarihleri ​​arasında arama yapmak için modelinde özel bir yöntem yazabilirsiniz:

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

Bildiğim kadarıyla doğrulamak gibi, iki tarihleri ​​doğrulamak için modelin beforeValidate() geri arama kullanabilirsiniz. Bu here hakkında daha fazla bilgi.

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(); 
} 

Bu soruya cevap veriyor mu?

8

seni doğru takip ediyorum edin: Bu tarihleri ​​doğrulamak gerekir

  • bir formdan oluşturulan sorguları bulmak için

    • kullanıcı/başlangıç ​​bitiş tarihleri ​​belirtmelisiniz, böylece örneğin:
        değil yüzyıllar uzakta başlangıç ​​tarihinden itibaren başlangıç ​​tarihinden
      • bitiş tarihinden sonra olan
      • bitiş tarihi
    • Sen onlar uzakta koşullar diziye içine sıkışmış zaman kapmak için onlar daha zor olacak bu tarihleri ​​doğrulamak istediğimizden doğrulama hataları

    (bu bir tasarruf olmadığı halde) form içinde satır içi görünen istiyorum. Ben ayrı ayrı bu geçiş yapmaya çalışan ve daha sonra onlarla uğraşırken öneriyorum:

    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; 
    } 
    

    ben sırasında Model::invalidate() kullanarak denemedim: Sen umarım beforeFind filtresinde başka her şeyi ele almak gerekir

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

    Bir bulma işlemi, bu yüzden işe yaramayabilir. Buradaki fikir, form FormHelper kullanılarak oluşturulmuşsa, bu iletiler form alanlarının yanında olmasını sağlamalıdır.

    Bunun başarısız olması durumunda, denetleyicide bu doğrulamayı gerçekleştirmeniz ve Session::setFlash()'u kullanmanız gerekebilir. eğer öyleyse, beforeFind'dan kurtulup BETWEEN koşul dizisini diğer koşullarınızla da koyabilirsiniz. Son 20 güne ait verileri bulmak istiyorsanız

  • 1

    .

    $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'))); 
    

    diğer akıllı iki tarih arasında

    $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)