在cakephp 3

时间:2017-06-20 06:19:10

标签: cakephp cakephp-3.4

我正在开发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表的列为idapi_key,并且调用记录在api_calls表中,其列为iduser_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'); 进行统计?

1 个答案:

答案 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子句,或使用>=<=比较手动限制值一天的开始和结束。

另见