如何在cakephp 3中获取上个月的行总和

How to get last month row sum in cakephp 3

我需要获取上个月的交易金额总和,我写了查询但出现错误 Error: Call to undefined function App\Controller\YEAR()

// sum of total received amount 
  $conditions['transaction_type']=1;
  $conditions['AND']['YEAR(Transactions.created) >='] = YEAR('CURRENT_DATE - INTERVAL 1 MONTH');
  $conditions['AND']['MONTH(Transactions.created) <='] = MONTH('CURRENT_DATE - INTERVAL 1 MONTH');
  $query = $this->Transactions->find('all',['conditions'=>$conditions]); 
  $collection = new Collection($query);
  $sumOfReceivedAmount =  $collection->sumOf('amount');
  $this->set('sumOfReceivedAmount',$sumOfReceivedAmount);

我也尝试过使用查询生成器

$query = $this->Transactions->find()
               ->where(function ($exp, $q) {
                     $year = $q->func()->year([
                          'created' => 'identifier'
                     ]);
                     $month = $q->func()->month([
                          'created' => 'identifier'
                     ]);
                     return $exp
                     ->eq($year, $q->func()->year(['CURRENT_DATE - INTERVAL 1 MONTH']))
                     ->eq($month, $q->func()->month(['CURRENT_DATE - INTERVAL 1 MONTH']));
 });

对于此代码,我收到类似

的查询
SELECT 
  *
FROM 
  transactions Transactions 
WHERE 
  (
    year(created) = (
      year(
        'CURRENT_DATE - INTERVAL 1 MONTH'
      )
    ) 
    AND month(created) = (
      month(
        'CURRENT_DATE - INTERVAL 1 MONTH'
      )
    )
  )

问题是这个单引号 'CURRENT_DATE - INTERVAL 1 MONTH'

如何删除这个单引号?

与您将传递的值声明为 identifier 的其他 year() 用法类似,您必须将其他值声明为 literal 值(或传递表达式对象),以便它们按原样插入到查询中,而不是被绑定。

['CURRENT_DATE - INTERVAL 1 MONTH' => 'literal']

CakePHP 还附带了表达类似功能的方法,特别是 FunctionsBuilder::dateAdd() 方法。此外,当将 CURRENT_DATE 表示为函数时,查询构建器将能够为其他 DBMS(例如没有 CURRENT_DATE:

的 SqlServer 转换 SQL
$q->func()->year(
    [$q->func()->dateAdd($q->func()->CURRENT_DATE(), -1, 'MONTH')]
)

NOW() 也应该有效:

$q->func()->dateAdd($q->func()->now(), -1, 'MONTH')

另见