我有一个大数据集(超过十亿行)。数据在数据库中按日期分区。因此,我的查询工具必须在每个查询中指定一个 SQL between 子句,否则它将必须扫描每个分区……好吧,它会在返回之前超时。
所以..我的问题是,数据库中分区的字段是一个日期..
使用 CakePHP,如何在我的表单中指定“介于”日期?
我正在考虑在表单本身中执行“start_date”和“end_date”,但这可能会给我带来第二个问题。我如何在链接到表格的模型中验证它?
最佳答案
如果我没听错:
- 用户必须为从表单生成的查找查询指定开始/结束日期
- 您需要验证这些日期,例如:
- 结束日期在开始日期之后
- 结束日期距离开始日期不超过几个世纪
- 您希望验证错误显示在表单中(即使这不是保存)
由于您想验证这些日期,因此当它们隐藏在您的条件数组中时,它们将更难获取。我建议尝试将它们分别传入,然后再处理它们:
$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
创建的,这些消息应该返回到表单字段旁边。
否则,您可能需要在 Controller 中执行此验证并使用 Session::setFlash()
。如果是这样,您还可以去掉 beforeFind
并将 BETWEEN
条件数组与您的其他条件放在一起。
关于mysql - 带有 "Between dates"的 CakePHP 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1329635/