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