我正在开发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
表的列被id
、api_key
和调用记录在api_calls
表中,其列分别是id
、user_id
、custom_api_id
、created
每次需要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
在这里不起作用,因为它适用于单个结果,而不是聚合结果,这正是您在这里需要的。
构建,为了创建与函数表达式的比较,您必须离开表达式生成器,例如使用 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