2017-06-20 46 views
0

我正在使用CakePHP 3.4根據cakephp中按日期分組的計數得到結果3

我正在構建一些使用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_idcustom_api_idcreated

每次需要API的用戶訪問函數,在api_calls表中創建了一個記錄,並且已經創建了時間調用表和custom_api的主鍵。

我的問題是,如何從他們的呼叫計數小於100的那一天CustomApi模型得到的API密鑰

編輯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

+0

與'ApiCalls'的左連接,其中'created'在今天的界限中,通過其主鍵對組「CustomApi」進行分組,並且僅選擇具有小於100的「ApiCalls」計數的那些'CustomApi'。 – ndm

+0

好吧,試着你說的 –

+0

你好ndm,請檢查'編輯2'。對你說的是否正確?如何在「哪裏」計數。我嘗試了谷歌搜索,但沒有發現。 –

回答

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條款,或手動鉗使用針對初>=<=比較和一天結束時的值。

又見