Bonjour,
j'ai un problème qui est surement arrivé à beaucoup d'entre nous, quand on tri une requête sur une clé qui a des valeurs récurrentes (exemple un status online qui prend soit 0 soit 1 comme valeur, je veux trier par online ou offline) avec un ORDER BY et qu'on met une LIMIT par exemple 0,20 pour la page 1 et ensuite 20,20 pour la page 2, on se retrouve avec parfois les même occurences sur la page 1 et sur la page 2...
Et oui notre cher MySQL pour générer la page 1 va trier d'une certaine manière les lignes pour en afficher que les 20 premières et quand on lui demande la même requête mais d'afficher les 20 suivantes, en rééffectuant la requête, il ne va pas trier les données de la même manière. Ce sera toujours ordonnés selon la clé online par exemple donc tout les online au dessus et tout les offlines après mais dans les online il ne va pas trier les données de la même manière sur les deux requêtes... Et oui notre requête n'est pas déterministe donc forcement des fois ça coince...

Bref sur mon serveur local je n'ai pas ce problème mysql (5.5.24) par contre sur mon serveur de production mysql (5.6.10) là ça merde... ET rien n'a y faire, j'ai des clés primaires unique dans ma table qui devrait servir d'index mais non rien à foutre il tri comme il a envie... qu'il est gentil !

Bon j'ai pas mal chercher dans les config de mysql et sans succès.

Mon idée est donc de rendre toute mes requêtes déterministes dans cakephp !
Pour ce faire je souhaite utiliser beforefind qui va rajouter un ORDER BY sur ma clé primaire sur chaqu'une de mes requêtes.
Voici mon code que j'ai placé dans l'AppController

public function beforeFind($queryData) {
        $sticky = array($this->alias.'.id' => 'DESC');
        if (is_array($queryData'order'][0])) {
            $queryData'order'][0] = $queryData'order'][0] + $sticky;
        }
        else {
            $queryData'order'][0] = $sticky;
        }
        return $queryData;
    }

Evidement ça ne fonctionne pas, j'utilise la component paginate de cake et il n'en as strictement rien à foutre de mon beforeFind.

Si quelqu'un à une idée je suis preneur.

Merci d'avance !

1 réponse


Nightbringer
Auteur
Réponse acceptée

Bon j'ai trouvé... c'est tellement nul comme erreur...
BeforeFind ce met dans AppModel...
Bref je laisse ce topic ça pourra toujours servir à des gens qui ont le même problème.