1

我正在使用 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_apiidapi_key调用记录在api_calls列是iduser_idcustom_api_id、的表中created

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

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

编辑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

4

1 回答 1

0

你快到了,你需要使用一个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手动限制值。>=<=

也可以看看

于 2017-06-22T22:13:42.900 回答