2009-08-25 12 views
5

मेरे पास एक बड़ा डेटा सेट है (एक बिलियन पंक्तियों से अधिक)। डेटा डेटाबेस द्वारा तिथि में विभाजित है। इस प्रकार, मेरे प्रश्न उपकरण को प्रत्येक क्वेरी पर खंड के बीच एक एसक्यूएल निर्दिष्ट करना होगा, या इसे प्रत्येक विभाजन को स्कैन करना होगा .. और ठीक है, यह कभी भी वापस आने से पहले समय-समय पर होगा।केकपीएचपी मॉडल "तिथियों के बीच"

तो .. मेरे सवाल है, विभाजित डेटाबेस thats में क्षेत्र एक तारीख है ..

CakePHP का उपयोग करना, मैं अपने फार्म में दिनांक "के बीच" निर्दिष्ट कर सकते हैं?

मैं फ़ॉर्म में "start_date" और "end_date" करने के बारे में सोच रहा था, लेकिन इससे मुझे दो दूसरा प्रश्न मिल सकता है .. मैं एक मॉडल से जुड़े मॉडल में इसे कैसे सत्यापित करूं? जहां तक ​​मान्य के रूप में

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

, तो आप दो तिथियों को मान्य करने के मॉडल की beforeValidate() कॉलबैक इस्तेमाल कर सकते हैं:

उत्तर

0

आप तिथियों के बीच खोज करने के लिए अपने मॉडल में एक कस्टम विधि लिख सकते हैं। इस 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

मैं तुम्हें सही ढंग से अनुसरण कर रही हूं, तो:

  • उपयोगकर्ता के लिए एक प्रपत्र
  • आप इन तिथियों को मान्य करने की जरूरत से उत्पन्न क्वेरी मिली शुरू समाप्ति तिथियाँ निर्दिष्ट करना होगा/ताकि, उदाहरण के लिए:
    • आरंभ तिथि
    • अंतिम तिथि प्रारंभ तिथि से नहीं सदियों से दूर के बाद समाप्ति दिनांक
  • आप सत्यापन त्रुटियों रूप में इनलाइन प्रदर्शित होने (भले ही यह एक नहीं बचा है)

जब से तुम हड़पने के लिए जब वे दूर अपनी शर्तों सरणी के अंदर tucked रहे हैं इन तिथियों वे कठिन होगा मान्य करने के लिए चाहते हैं। मैं अलग से इन पारित करने के लिए कोशिश कर रहा है की सलाह देते हैं और फिर उन्हें साथ काम बाद में:

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

आप उम्मीद है कि beforeFind फिल्टर में सब कुछ संभाल करने के लिए सक्षम होना चाहिए:

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() उपयोग करने की कोशिश नहीं की है एक खोज ऑपरेशन, तो यह भी काम नहीं कर सकता है। विचार यह है कि यदि फॉर्म 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) 
संबंधित मुद्दे