Bonjour, je vous remerci d'avance ceux qui prendrons (ou non) le temps de me répondre.

Mon problème est le suivant :
J'ai une table de message avec un champs "read" (par défault à 0), et j'aimerais que celui-ci passe à 1 une fois mon select fait sur les entrés récupèrés.

Si je fais un find pour récupèrer mes données suivis d'un updateAll sur les champs en question le problème c'est que le retour de la fonction find() pourtant fait en amont deviens vide, comme si le updateAll touchait aussi à la variable de sortie du find effectué plus haut.

Par exemple :

$resultNotifications = $this->Notifications->find('all')->where([
'user_id' => $this->Auth->user('id'),
'Notifications.read_alert' => '0'
]);
$this->set('notifications', $resultNotifications);

$result = $this->Notifications->updateAll(
['read_alert' => 1], 
['user_id' => $this->Auth->user('id')]
);

Ce code va récupèrer les notifications sans soucis, si je colle un debug/die avant le updateAll je récupère bien tout.
Par contre si je fais un debug/die à la fin, $resultNotifications est maintenant vide (et les champs concerné bien update à 1 dans la BDD.

Je suppose donc que je m'y prend mal.
Si jamais la manière d'on j'essais de faire ça n'est pas la bonne j'attends des conseils avec plaisir :)

4 réponses


Xeta
Réponse acceptée

Hello,
C'est tout simplement que la première requête n'est pas exécuté avant l'affichage avec le foreach, et vue que tu fait un updateAll juste après, quand tu l’exécutes dans ta vue, tu as aucun résultat car les notifs ont toutes été marqué comme read avec le updateAll.
http://book.cakephp.org/3.0/fr/orm/query-builder.html#comment-les-requetes-sont-evaluees-lazily

Bonsoir.
As-tu tout simplement essayé de transmettre ta variable à la vue aprés ton updateAll ?
Si tu ne l'as pas essayé, c'est l'occasion.

Sha0ne
Auteur

Si, j'ai essayé, mais ça ne fonctionne pas plus, de la même manière si je mets l'hydrate à false ça ne change rien :/

Sha0ne
Auteur

"La valeur retournée de toute méthode find est toujours un objet Cake\ORM\Query. La classe Query vous permet de redéfinir une requête plus tard après l’avoir créée. Les objets Query sont évalués lazily, et ne s’exécutent qu’à partir du moment où vous commencez à récupérer des lignes, les convertissez en tableau, ou quand la méthode all() est appelée:"

Donc en utilisant : $results = $query->toArray();, ça devrait fonctionner, merci Xeta :)