【问题标题】:CakePHP 3.6 - Find All Records Created Between Two DatesCakePHP 3.6 - 查找在两个日期之间创建的所有记录
【发布时间】:2019-07-24 00:03:28
【问题描述】:

我正在查找两个日期之间的所有记录

我的变量

 $start = '01/01/2009';
 $end = '07/24/2019';

我试过了

$gross = $this->CartOrders->find('all')->where(['placed >=' => $start])->andWhere(['placed <=' => $end])->all();

上面的查询片段

... FROM cart_orders CartOrders 
WHERE (placed >= :c0 AND placed <= :c1) 
[params] => Array ( 
     [:c0] => Array ( [value] => 01/01/2009 [type] => datetime [placeholder] => c0 ) 
     [:c1] => Array ( [value] => 07/24/2019 [type] => datetime [placeholder] => c1 ) )

结果

 Cake\ORM\ResultSet Object ( [items] => Array ( ) )

我也试过

$gross = $this->CartOrders->find('all')->where(function($exp) use($start,$end) {
        $exp->lte('placed', $end);
        $exp->gte('placed', $start);
        return $exp;
    })->all();

我也试过

$gross = $this->CartOrders->find('all')->where(function($q) use($start,$end) {
        return $q->between('CartOrders.placed', $start, $end, 'date');
    })->all();

关于如何实现这一点的任何想法?

【问题讨论】:

  • 所有这些例子都应该有效。
  • 那就让我再摆弄一下吧……
  • 我刚刚尝试了 andWhere 版本,并检查了日期,如果我删除了 andWhere,它会给我在 $start 之后创建的所有内容,但是当我添加 andWhere 时,它​​什么也没给我。 ..
  • 有没有可能是语言环境问题,并且结束日期被误解了?也许尝试将这些日期放入 FrozenDate 对象并使用 where 中的那些?
  • MM/DD/YYYY 绝对是错误的格式,您的数据库很可能在各自的日期(时间)列中使用YYYY-MM-DD,如果没有,那么您需要更改它,因为02/01/2019 大于01/02/2019

标签: cakephp cakephp-3.x cakephp-3.6


【解决方案1】:

使用 QueryExpression

use Cake\Database\Expression\QueryExpression;

$query = $this->CartOrders->find()
->where(function (QueryExpression $exp, Query $q) use ($start,$end){
    return $exp->between('placed', $start, $end);
});

如果用户尝试在同一天内搜索,可能会添加时间条件

return $exp->between('placed', $start . " 00:00:00", $end . " 23:59:59");

【讨论】:

    【解决方案2】:

    尝试使用

    $this->CartOrders->find('all', array('conditions' => array(
            'date(placed) BETWEEN "'.$start.'" AND "'.$end.'"')));
    

    这是一个非正统的解决方案,但它对我来说适用于多种场景

    【讨论】:

    • 请永远不要将动态数据插入平面数组值,这是一个可能的 SQL 注入漏洞!始终使用key =&gt; value 语法、安全表达式或绑定!
    • 如果这样更好$this-&gt;CartOrders-&gt;find('all', 'conditions' =&gt; array('CartOrders.placed between ? and ?' =&gt; array($start_date, $end_date)));
    • 这样会更好,是的,但问题是关于 CakePHP 3.x,这种风格是为 CakePHP 2.x 设计的,3.x 不再支持了。
    【解决方案3】:
    $this->set('gross',$this->CartOrders-> find(
                    'all', array(
                        'conditions' => array(
                            'CartOrders.placed >=' => $start,
                            'CartOrders.placed <=' => $end
                        ))
                ));  // here gross is a variable to store the data from DB and CartOders is the Model name
    

    【讨论】:

    • 这应该如何解决问题?该 sn-p 将产生与问题中的示例完全相同的查询。
    【解决方案4】:

    原来是日期格式问题。

    以下解决了我的问题。

    $start = '01/01/2009';
    $end = '07/24/2019';
    
    $start = DateTime::createFromFormat('d/m/Y', $start);
    $end = DateTime::createFromFormat('d/m/Y', $end);
    
    $gross = $this->CartOrders->find('all')->where([
         'placed >=' => $start->format('Y-m-d')
    ])->andWhere([
         'placed <=' => $end->format('Y-m-d')
    ])->all();
    

    这个链接有帮助

    PHP convert date format dd/mm/yyyy => yyyy-mm-dd

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 2014-02-11
      相关资源
      最近更新 更多