2017-05-27 4 views
0

Je développe un système qui contient des rapports des ordinateurs des clients et affiche les échecs dans une liste. Je tente d'écrire une requête qui localise tous les systèmes qui ont actuellement échoué ou ont des échecs dans le passé.CakePHP Query - Conditionnel basé sur Container Champ

Mon modèle pour Computers a un champ qui indique last_report_pass qui me permet de trouver rapidement les ordinateurs qui ont échoué le jour en cours. Mes Reports sont associés à un ID d'ordinateur et ont un champ appelé status qui indique s'il s'agit d'une réussite ou d'échec.

Je tente d'écrire une requête qui montrera seulement last_report_pass étant 0, ou a échoué, ou l'afficher si elle a des rapports qui ont été trouvés et joints (signifiant qu'il y avait des échecs précédents).

Voici mon idée était:

$computers = $this->Computers->find('all', [ 
    'conditions' => [ 
     'last_report_pass' => '0', 
     'COUNT(Reports) NOT' => '0' 
    ], 
    'contain' => [ 
     'Reports' => [ 
      'conditions' => [ 
       'status' => '0' 
      ] 
     ] 
); 

Je ne sais pas quoi faire d'ici. Je pourrais probablement écrire cela en SQL mais j'essaie de rester avec le constructeur de requêtes ORM de Cake. Merci d'avance!

+0

Je serais probablement utiliser un cache de compteur pour compter ces ... ce serait facilement la réponse la plus simple et vous serait alors stocker le nombre de rapports dans le tableau des ordinateurs qui serait à portée de main dans d'autres façons aussi peut-être. –

Répondre

0

Vous devez utiliser matching son similaire à contenir, mais il filtrera les données associées:

Ce sera quelque chose comme ça

$query->distinct(['Computers.id']) 
    ->matching('Reports', function ($q) { 
     return $q->where(['Reports.last_report_pass' => 0]); 
    }); 

Il est important de noter que vous aurez également à contain le tableau Reports si vous avez besoin de données qui sont sur cette table

Reference

+0

J'ai essayé d'utiliser l'appariement et j'ai dupliqué l'ordinateur pour chaque rapport correspondant. Existe-t-il un moyen de faire cela afin que les rapports avec last_report_pass 0 soient contenus dans un sous-tableau comme c'est le cas avec un contenu normal? –

+0

Modifié le message original, ajouté la clause distincte, deviner peut fonctionner – diego182