在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_idcustom_api_idcreated

每次需要 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 子句,或使用 >=<= 手动限定值与一天开始和结束的比较。

另见