Bonsoir à tous

Je suis en train de créer les dernières actions d'affichage d'une table Interventions qui contient elle même des informations mais également des relations BelongsTo qui ne pose pas de soucis lorsque je fais un simple find('all'), sans condition. Cette même table est relié à une autre (History) via une relation hasmany().
Cette table History enregistre au fur et à mesure les actions des utilisateurs, surtout l'avancé d'une intervention. Ces informations seront mesuré, étudié dans le but d'établir des Stats (je ne suis pas encore à cette étape).
Pour chaque intervention, il y a 5 possibilités (5 cas):
L'intervention est créé mais pas attribué à un agent (cet action fonctionne)
L'intervention est attribué mais pas commencé.
L'intervention est attribué et est commencé.
L'intervetion est terminé pour l'équipe mais attend la validation du chef.
L'intervention est close. (cet action est faité également).

Mon soucis est que dans les 3 cas où je suis bloqué je dois faire un count sur la table Histories pour savoir s'il y a d'un action commencé ou non. En effet, quant une intervention sera débuté, l'agent devrait informé dans l'application l'arrivée sur le lieu et donc créera, sans le savoir directement une entrée dans la table histories. Donc si le count me renvoie 0, cela signifiera que je suis dans le cas 2, sinon dans le cas 3...

Mon idée à la base était de faire une condition dans ce genre:

<?php
public function specific($id=null)
    {
        $this->Intervention->recursive=1;
        //cas 1
        if($id==1)
        {
            //Non attribué a une equipe
            //note: champs equipe_id equivaut à 0
            $conditions=array(
                'Intervention.equipe_id'=>'0'
            );
        }
        elseif($id==2)
        {
                $conditions=array(
                'Intervention.equipe_id <>'=>'0',
                                'History.nbhistory'!=0
            );
        }
        //$this->Intervention->recursive=1;
        $interventions=$this->Intervention->find('all',array(
            'conditions'=>$conditions));
        $this->set('interventions',$interventions);
    }
?>

Et ajoutant un champs virtual afin d'obtenir le nombre d'entrée dans la table history.

Cependant cela ne fonctionne pas.
Auriez vous des idées pour résoudre mon soucis?

Merci d'avance.
Nb: si vous voulez plus d'information, n'hésitez pas.

4 réponses


amethyste
Réponse acceptée

Tu devrais utiliser le countercache, ce sera nettement plus simple :

Je ne comprend pas ton equipe_id qui aurait une valeur égale à 0.
Normalement les id sont autoincrémentés et ne peuvent pas avoir un id égale à 0, un champ du type state par exemple serait plus judicieux je pense.
Je pense aussi, qu'il serait mieux que tu fasse cette fonction en private au lieu de public et y faire appel depuis ton model dans l'action directement via par exemple :

private function _verif($id = null){
    / **Ton code** /
}
public function mafonction(){
    / **ton code** /
    $this->_verif();
    / **suite du code** /
}

@amethyste
Je ne crois pas que le counterCache l'aidera dans son cas de figure, car a priori il se trompe lui même, ce n'est pas un find tu type count mais un first qu'il faut qu'il fasse.
Le count est fait pour retourner un nombre d'enregistrement et non pour savoir si un enregistrement à une valeur spécifique, il vaut mieux qu'il fasse un first et faire un truc du genre :

$data = $this->Intervention->find('first', array(/ **conditions** /));
if(!empty($data)){
    / **code** /
} else {
    / **code** /
}

Voilà, c'était une petite aide rapide, mais je pense que tu comprends mieux maintenant.

Je penses que ton probleme vient de la:

elseif($id==2)
        {
                $conditions=array(
                'Intervention.equipe_id <>'=>'0',
                                'History.nbhistory'!=0 <<====== PROBLEME ICI
            );
        }

test:

elseif($id==2)
        {
            $conditions=array(
                'Intervention.equipe_id <>' => 0, /* Juste pour moi, j'ai retiré le simple quote ^^ */
                'History.nbhistory <>' => 0 /* Partie modifié */
            );
        }

Je vais répondre en ordre décroissant.
J'ai testé, et cela ne marche pas non plus.
Pour répondre à amethyste , je suis justement en train de tester en faisant un insert bidon sans interface insert update. Je suis encore à la partie view (select en gros). Je teste counterCache pour voir si j'ai bien compris le principe et voir si cela fonctionne.

Merci en tout cas.

EDIT: La méthode de amethyste est la bonne. Merci je ne connaissais pas counterCache