Bonjour,
Supposons que les models Post et Champs soit liés et que debug ($this->Post->find('all');
donne le tableau suivant :
'Post' => array(
'id' => '1',
'name' => 'post_name'
),
'Champs' => array(
(int) 0 => array(
'id' => '1',
'name' => 'gt',
'variable' => '12.0',
'post_id' => '1'
),
(int) 1 => array(
'id' => '3',
'name' => 'name',
'variable' => '12.0',
'post_id' => '1'
),
(int) 2 => array(
'id' => '5',
'name' => 'nmk',
'variable' => null,
'post_id' => '1'
),
Je ne comprends pas comment travailler sur les données qui font partie d'un tableau associatif quand on a pas besoins d'un foreach.
Par exemple si je veux faire un find('count') de Champs seulement si 'variable' n'est pas null ??
Si on fait un $this->Post->Champs->find('count'); le résultat sera 3. Mais pour ajouter la condition que 'variable' ne doit pas etre null ce code ne marche pas : $this->Post->Champs->find('count',array('conditions'=>array('Champs.variable !='=>null))). on obtient une erreur comme quoi Champs.variable n'existe pas.
Ceci n'est qu'un exemple mais de façon générale j'ai toujours un problème pour designer les variables sur les arrays associatifs;
J'ai esseyé par exemple $post'Champs']]'variable'], ou $post'Champs'][n]'variable'] ou encore $post'Champs']{n}]'variable'], rien ne marche il faut designer un index ou utiliser un foreach, seulement pour l'exemple du count en haut j'ai besoin du resultat pour tout le tableau Champs et non pas un résultat pour chaque tableau de Champs.
Merci de m'indiquer comment procéder car ce problème me bloque sérieusement et je n'arrive plus à le contourner.
Parceque Champs.variable n'existe pas dans le tableau que donne find; ce qui existe c'est : Champs.[0] , Champs.[1] , Champs.[2]... puis variable, .
Dans le find Champs n'est plus une table dans mysql mais un tableau défini par les liaisons entre les models.
En fait, j'ai pu résoudre ce problème et obtenir exactement ce que je veux grace à quelqu'un qui m'a orienté vers la méthode Hash. Je ne donne pas tout le code mais sachez que j'utilise ce code dans une méthode afterfind d'un modèle :
champs correspond a Biology et variable correspond a plq, hb,uree...
public function afterFind($results, $primary = false){
$data = $results;
foreach ($data as $k=>$d) :
$d'countplq'] = count(Hash::filter(Hash::extract($d , 'Biology.{n}.plq')));
$d'counthb'] = count(Hash::filter(Hash::extract($d , 'Biology.{n}.hb')));
$d'counttp'] = count(Hash::filter(Hash::extract($d , 'Biology.{n}.tp_tcq')));
$d'counturee'] = count(Hash::filter(Hash::extract($d , 'Biology.{n}.uree')));
$d'countcreat'] = count(Hash::filter(Hash::extract($d , 'Biology.{n}.creat')));
$d'countkal'] = count(Hash::filter(Hash::extract($d , 'Biology.{n}.kal')));
$d'countnat'] = count(Hash::filter(Hash::extract($d , 'Biology.{n}.nat')));
$data$k]=$d;
}
endforeach ;
return $data;
Si vous vous rendez sur ce lien (Site en construction) vous trouverez l'application de ce code imbriqué.
En fait tous les paramètres 'Biologie' font partie de la meme table sql et qu'on on insère les données on peut agir comme on veut : remplire toutes les cases, remplir quelques cases de NFS ou IONOGRAMME, remplir ou pas quelques cases de NFS et/ou ionogramme. Bref quoiqu'on fasse le tableau affiché s'adapte et varie ses cases en fonction de ce qui est rempli et de ce qui ne l'est pas(Etudiez bien les dates pour vous rendre compte de la complexité de la tache). Je ne sais pas si je me suis fait comprendre mais Il s'agit en fait de deux tableaux (ou plus si je veux en ajouter) qui sont 100% dynamiques et modulables et qui changent de forme dans toutes les situations quelque soit la situation tout en travaullant sur une seule et unique table (avec des liaisons un peu particulières).
Entre nous je suis fier du résultat surtout qu'il y a a peine 2 mois je ne savais pas ce que signifie Html et css. :)
Pourquoi tu ne fais pas ton find('count') directement sur le model Champs ?
$this->Champs->find('count', array(
'conditions' => array('Champs.variable !=' => null)));