mysql - 带有 "Between dates"的 CakePHP 模型

标签 mysql cakephp date

我有一个大数据集(超过十亿行)。数据在数据库中按日期分区。因此,我的查询工具必须在每个查询中指定一个 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/

相关文章:

mysql - 验证 JSF 实体中的持久日期

php - 使用 MySQL 进行时间计算

java - DateTimeFormatter.format 与大陆/城市

mysql - 同一查询中有 2 个条件

MySQL: bool 值上的 "= true"与 "is true"。什么时候最好使用哪一个?哪一个是独立于供应商的?

PHP fatal error : Call to a member function prepare() on a non-object in admin\includes\html\database. class.php 第 45 行

CakePHP 测试装置在运行测试用例后永久删除我的表

node.js - 在 Nodejs 中从 Cakephp 实现 Security::Hash

mysql - 如何通过 Ecto 向 MySQL 提供索引提示

php - Cakephp 如何基于另一个虚拟字段创建虚拟字段