我正在开发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
,{ {1}},custom_api_id
每次需要API的用户访问功能时,会在created
表中创建一条记录,其中包含时间调用和custom_api的主键。
我的问题是,如何从api_calls
模型中获取Api密钥,当天的呼叫数量小于100(即今天)
编辑2:我的尝试
CustomApi
如何在$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');
进行统计?
答案 0 :(得分: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
子句,或使用>=
和<=
比较手动限制值一天的开始和结束。
另见