2017-06-20 4 views
0

gruppiert Ergebnis gefiltert Ich arbeite an CakePHP 3.4erhalten durch Zählung nach Datum in cakephp 3

ich eine Anwendung am Bau, die API-Schlüssel verwendet. Ein Schlüssel ist auf 100 Anrufe pro Tag begrenzt, daher verwende ich mehrere Schlüssel und möchte diese durchlaufen.

In meinem Controller, ich rufe eine Funktion des Modells API

$api_key = $this->CustomApi->getKey(); 
if (!$api_key) { 
    $this->Flash->error(__('API key not found')); 
} else { 
    ... 
} 

Im Modell zu erhalten CustomApi ich getKey() Funktion schreiben will, die Api Schlüsselzahl, dessen Aufruf des Tages finden, ist weniger als 100.

Spalten der Tabelle custom_api sind id, api_key und Anrufe werden in api_calls Tabelle, deren Spalten aufgezeichnet sind id, user_id, custom_api_id, created

Jedes Mal, wenn die Benutzerzugriffsfunktion die API benötigt, wird in der Tabelle api_calls ein Datensatz mit dem Zeitpunkt, zu dem der Anruf getätigt wurde, und dem Primärschlüssel von custom_api erstellt.

Meine Frage ist, wie Api Schlüssel aus CustomApi Modell, dessen Anruf zählt, sind weniger als 100 für diesen Tag

Edit 2 erhalten (dh heute.): Mein Versuch

$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'); 

Wie zähle ich in where?

+0

Linke Join mit 'ApiCalls', wo' created' in den Grenzen von heute ist, Gruppe 'CustomApi' durch seinen Primärschlüssel, und wählen nur die' CustomApi's mit einer Anzahl von 'ApiCalls's kleiner als 100. – ndm

+0

ok, versuche, was du gesagt hast –

+0

Hallo ndm, bitte check 'edit 2'. Ist es richtig gegen das, was du gesagt hast? Wie man in 'wo' zählt. Ich habe versucht zu googeln, aber nichts gefunden. –

Antwort

0

Sie sind fast da, Sie müssen eine HAVING Klausel verwenden, WHERE wird hier nicht funktionieren, da es auf einzelne Ergebnisse funktioniert, anstatt auf aggregierte, was Sie hier brauchen.

SQL-Funktionen können mit dem Funktionsgenerator erstellt werden. Um einen Vergleich mit einem Funktionsausdruck zu erstellen, müssen Sie den Ausdrucksbaustein beispielsweise mit der Methode lt() (weniger als) erstellen.

$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 
     ); 
    }); 

Und falls ApiCalls.created nicht nur eine Datumsspalte ist, würden Sie eine BETWEEN Klausel verwenden oder manuell den Wert mit >= und <= Vergleichen gegen den Anfang und das Ende des Tages klemmen.

Siehe auch