获取按 CakePHP 3 中按日期分组的计数过滤的结果



我正在开发CakePHP 3.4

我正在构建一些使用 API 密钥的应用程序。一个密钥每天限制为 100 次调用,所以我使用多个密钥并希望循环访问它。

在我的控制器中,我正在调用模型的函数来获取API

$api_key = $this->CustomApi->getKey();
if (!$api_key) {
    $this->Flash->error(__('API key not found'));
} else {
    ...
}

在模型 CustomApi 中,我想编写getKey()函数,该函数将找到当天调用计数小于 100 的 API 密钥。

custom_api表的列被idapi_key和调用记录在api_calls表中,其列分别是iduser_idcustom_api_idcreated

每次需要API的用户访问功能时,都会在表中创建一个记录api_calls其中包含已调用的时间和custom_api的主键。

我的问题是,如何从当天(即今天(调用计数小于 100 的模型中获取 Api 密钥CustomApi

编辑2:我的尝试

$key = $this
    ->find()
    ->select(['CustomApi.id', 'CustomApi.api_key'])
    ->where(['CustomApi' => /* count is less than 100 */])
    ->leftJoinWith('ApiCalls', function ($q) {
          return $q->where(['ApiCalls.created' => date('Y-m-d')]);
    })
    ->group('CustomApi.id');

如何在where中计数?

你快到了,你需要使用 HAVING 子句,WHERE在这里不起作用,因为它适用于单个结果,而不是聚合结果,这正是您在这里需要的。

SQL 函数可以使用函数生成器

构建,为了创建与函数表达式的比较,您必须离开表达式生成器,例如使用 lt()(小于(方法。

$this
    ->find()
    ->select(['CustomApi.id', 'CustomApi.api_key'])
    ->leftJoinWith('ApiCalls', function ($q) {
        return $q->where(['ApiCalls.created' => date('Y-m-d')]);
    })
    ->group('CustomApi.id')
    ->having(function ($exp, $q) {
        return $exp->lt(
            $q->func()->count('ApiCalls.id'),
            100
        );
    });

如果ApiCalls.created不是仅日期列,则可以使用 BETWEEN 子句,或者使用>=手动将值与一天的开始和结束进行比较<=

参见

  • Cookbook> Database Access & ORM> Query Builder> Using SQL Functions
  • Cookbook> Database Access & ORM> Query Builder> Advanced Conditions(高级条件
  • (
  • API> \Cake\Database\FunctionsBuilder
  • API> \Cake\Database\Expression\QueryExpression

最新更新