Bonjour à tous !
Aujourd'hui, à moi de poser une question :)
J'essaie depuis ce matin d'amadouer le querybuilder de CakePHP 3 et j'ai plus ou moins ce que je veux.
La je tombe face au probleme suivant : les fonctions inconnues par le querybuilder. Comment lui faire comprendre que je veux utiliser une fonction qu'il ne connaît pas ?
Ce que je souhaite faire, en SQL :
select AVG(DATEDIFF(dateReparation, dateEntreeObjet)) as duree
from objets
group by month(dateEntreeObjet)
Ce qui m'affiche la duree moyenne (en jours) d'attente entre l'entrée d'un objet et sa réparation, et cela par mois.
La requête tourne, c'est super, je me lance dans mon contrôleur :
$moyRep = $this->Objets->find();
$query->select([
'dateEntreeObjet',
'dateReparation',
'prixFacture',
'duree'=>$query->func()->AVG("DATEDIFF('dateReparation', 'dateEntreeObjet')")
])
->group('month(dateEntreeObjet)');
$this->set('moyRep', $moyRep);
debug($moyRep);
Voilà, vous vous doutez bien que si je suis ici, à vous poser une question, c'est que quelque chose ne fonctionne pas...
Ici, pas d'erreurs, mais le debug me sort un select all de ma table objets et n'effectue pas mon avg(datediff...)
Si quelqu'un a une idée/solution, je suis preneur!
En vous remerciant :)
Test ça :
$moyRep = $this->Objets->find();
$moyRep->select([
'dateEntreeObjet',
'dateReparation',
'prixFacture',
'duree' => $moyRep->func()->avg("DATEDIFF('dateReparation', 'dateEntreeObjet')")
])
->group('month(dateEntreeObjet)');
$this->set('moyRep', $moyRep);
debug($moyRep);
Si ça fonctionne pas, poste moi le schema de ta table et le résultat attendu, je vais tester en local.
Hello,
Tu peux nous montrer le code au-dessus de celui-ci stp, pour voir d'où sort la variable $query. Et oublie pas que la fonction AVG est en minuscule.
$moyRep = $this->Objets->find();
$query = $moyRep->find('all');
Voilà, j'espère que ça t'aidera !
Ta proposition m'avance énormément, en effet, au debug j'obtiens ceci :
SELECT Objets.dateEntreeObjet AS `Objets__dateEntreeObjet`, Objets.dateReparation AS `Objets__dateReparation`, (COUNT(idObjet)) AS `nbObjet`, AVG(DATEDIFF('dateReparation', 'dateEntreeObjet')) AS `duree`
FROM objets Objets
GROUP BY month(dateEntreeObjet)
Mais il y avait encore une erreur que j'ai su résoudre, il ne faut pas de simple quote autour de dateReparation et dateEntreObjet ! ce qui nous donne :
$moyRep = $this->Objets->find();
$moyRep->select([
'dateEntreeObjet',
'dateReparation',
'nbObjet'=>$query->func()->count('idObjet'),
'duree' => $moyRep->func()->avg("DATEDIFF(dateReparation, dateEntreeObjet)")
])
->group('month(dateEntreeObjet)');
$this->set('moyRep', $moyRep);
debug($moyRep);
Avec les simple quotes, duree me rendait NULL !
Ca marche désormais !
Merci beaucoup Xeta :)