Mysql CakePHP模型,带有;“日期之间”;

Mysql CakePHP模型,带有;“日期之间”;,mysql,cakephp,date,Mysql,Cakephp,Date,我有一个很大的数据集(超过十亿行)。数据在数据库中按日期进行分区。因此,我的查询工具必须在每个查询上指定一个SQLBEVERY子句,否则它将不得不扫描每个分区。。好吧,它会在回来之前暂停 所以。。我的问题是,数据库中被分区的字段是日期 使用CakePHP,如何在表单中指定“中间”日期 我正在考虑在表单中使用“开始日期”和“结束日期”,但这可能会给我带来第二个问题。。如何在链接到表的模型中验证?您可以在模型中编写自定义方法在日期之间进行搜索: function findByDateRange($s

我有一个很大的数据集(超过十亿行)。数据在数据库中按日期进行分区。因此,我的查询工具必须在每个查询上指定一个SQLBEVERY子句,否则它将不得不扫描每个分区。。好吧,它会在回来之前暂停

所以。。我的问题是,数据库中被分区的字段是日期

使用CakePHP,如何在表单中指定“中间”日期


我正在考虑在表单中使用“开始日期”和“结束日期”,但这可能会给我带来第二个问题。。如何在链接到表的模型中验证?您可以在模型中编写自定义方法在日期之间进行搜索:

function findByDateRange($start,$end){
    return $this->find('all',array('date >= '.$start,'data >= .'$end));
}
至于验证,您可以使用模型的
beforeValidate()
回调来验证这两个日期。更多关于这个的信息


这回答了你的问题吗?

如果我没记错的话:

  • 用户必须为从表单生成的查找查询指定开始/结束日期
  • 您需要验证这些日期,例如:
    • 开始日期后的结束日期
    • 结束日期离开始日期不远
  • 您希望验证错误在表单中内联显示(即使这不是保存)
由于您希望验证这些日期,因此当它们隐藏在您的条件数组中时,将很难获取这些日期。我建议尝试单独传递这些信息,然后稍后再处理:

$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;
}
beforeFind()之前的公共函数{
//执行查询验证
如果($queryData['dateRange']['end']<$queryData['dateRange']['start'])){
$this->invalidate(
/*结束日期字段名称*/,
“结束日期必须在开始日期之后”
);
返回false;
}
/*重复进行其他验证*/
//将条件添加到查询之间
$queryData['conditions'][]=数组(
“Model.dateField介于?和?”=>数组(
$queryData['dateRange']['start'],
$queryData['dateRange']['end'],
),
);
未设置($queryData['dateRange']);
//继续查找
返回true;
}
我没有在查找操作期间尝试使用
Model::invalidate()
,因此这可能根本不起作用。其思想是,如果表单是使用
FormHelper
创建的,则这些消息应返回表单字段旁边


否则,您可能需要在控制器中执行此验证,并使用
Session::setFlash()
。如果是这样,您还可以在查找前去掉
并将
介于
之间的条件数组与其他条件放在一起。

如果您想查找最近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)
$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)