在cakephp 3中按日期分组的计数过滤结果
get result filtered by count grouped by date in 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()
函数,它将找到 Api 当天调用次数少于 100 的键。
custom_api
table 的列是 id
, api_key
并且呼叫记录在 api_calls
table 中,其列是 [=15] =]、user_id
、custom_api_id
、created
每次需要 API 的用户访问功能时,都会在 api_calls
table 中创建一条记录,其中包含调用时间和 custom_api 的主键。
我的问题是,如何从当天(即今天)调用次数少于 100 的 CustomApi
模型中获取 Api 密钥
Edit 2 : My Try
$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
子句,或使用 >=
和 <=
手动限定值与一天开始和结束的比较。
另见
我正在使用 CakePHP 3.4
我正在构建一些使用 API 密钥的应用程序。一个键每天只能调用 100 次,所以我正在使用多个键并想循环使用它。
在我的控制器中,我正在调用模型的函数来获取 API
$api_key = $this->CustomApi->getKey();
if (!$api_key) {
$this->Flash->error(__('API key not found'));
} else {
...
}
在模型 CustomApi
中,我想编写 getKey()
函数,它将找到 Api 当天调用次数少于 100 的键。
custom_api
table 的列是 id
, api_key
并且呼叫记录在 api_calls
table 中,其列是 [=15] =]、user_id
、custom_api_id
、created
每次需要 API 的用户访问功能时,都会在 api_calls
table 中创建一条记录,其中包含调用时间和 custom_api 的主键。
我的问题是,如何从当天(即今天)调用次数少于 100 的 CustomApi
模型中获取 Api 密钥
Edit 2 : My Try
$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
子句,或使用 >=
和 <=
手动限定值与一天开始和结束的比较。
另见