Entier inséré comme chaîne de caractères

Alors que PHP (7.0) me soutient que c'est un entier

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous !

Aujourd’hui, je suis vraiment embêté…

Je suis actuellement sur un projet Symfony qui utilise MongoDB pour persister une partie des informations. Dans divers cas, j’ai des IDs d’entités (objets persistés sous MySQL) à enregistrer dans mes documents.
Seulement, j’ai constaté que MongoDB n’est certes pas aussi souple conciliant que MySQL au niveau des types : si on lui met une chaîne de caractères dans une propriété, malgré le mapping qui dit que ça doit être un entier, ce sera une chaîne de caractères qui sera persistée. Et faire des recherches sur des valeurs qui sont des chaînes là où on s’attendrait à avoir des nombres, ça ne retourne rien.

Mais le plus surprenant dans tout ça, c’est que j’ai bien des entiers dans mes objets. J’ai entouré les mes dernières opérations de dumps pour vérifier le type de ma propriété, et PHP me confirme ce que j’imaginais.

J’ai fait ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class MonObjet
{
    /** @ODM\Type("int") */
    private propriete;

    public function setPropriete(int $propriete) {
        $this->propriete = $propriete;
    }
}
// …
$monObjet->setPropriete($unEntier); // $unEntier valant ici 1
dump(gettype($monObjet->getPropriete()); // retourne bien "integer"
$documentManager->persist($monObjet);
dump(gettype($monObjet->getPropriete()); // retourne toujours "integer"
$documentManager->flush();
dump(gettype($monObjet->getPropriete()); // retourne encore "integer"
// Histoire d'être sûr de ne pas persister des changements intempestifs
$documentManager->detach($monObjet);
dump(gettype($monObjet->getPropriete()); // retourne sans trop de surprise "integer"
unset($monObjet); // Pour avoir une erreur si je le modifiais plus loin
// Et pas d'erreur

En console, dans ma collection, j’ai droit à ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
> db.MonObjet.find({}, {"_id":0,"propriete":1})
{"propriete":"1"}
{"propriete":"1"}
{"propriete":"1"}
{"propriete":"1"}
> db.MonObjet.find({"propriete":1}, {"_id":0,"propriete":1})
> db.MonObjet.find({"propriete":"1"}, {"_id":0,"propriete":1})
{"propriete":"1"}
{"propriete":"1"}
{"propriete":"1"}
{"propriete":"1"}

Je suis donc sous Symfony 3.2.8 et PHP 7.0 avec entre autres les paquetages suivants :

1
2
3
4
alcaeus/mongo-php-adapter            1.1.0
doctrine/mongodb                     1.4.0
doctrine/mongodb-odm                 1.1.5
doctrine/mongodb-odm-bundle          3.3.0

Je viens de revérifier, et je n’ai pas de mise à jour pour ces paquetages, et il ne semble pas avoir vu d’issues sur GitHub qui soit de ce genre…

Donc je me tourne vers les agrumes. Est-ce que quelqu’un a déjà observé ce comportement ?

Merci  :)

Edit

A savoir que ce n’est que sur cette propriété que ça pose problème. J’en ai d’autres du même genre, et je n’observe rien d’anormal.

J’ai déjà vidé le cache Symfony, détruit/reconstruit mes collections, tenté de re-définir la valeur juste avant persistance. J’ai même été jusqu’à créer une propriété dans laquelle je stockais la même information pour voir, en faisant en sorte que le setter donne la même valeur aux deux propriétés. Si celle que j’ai ajoutée est bien un entier dans Mongo, l’autre reste une chaîne… o_O
J’ai aussi ce même nom de propriété dans d’autres documents, et je n’ai pas de problème…

Edit 2

>_<

Bon, j’avais fait une modification qui a été perdue à un moment, le mapping de mon champ était pour un type texte, et plus entier.

Je vais dormir demain…

Edit 3

Plus précisément, c’était modifié dans une autre branche pas encore fusionnée…

Édité par Ymox

Evitez qu’on vous dise de les lire : FAQ PHP et SymfonyTutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte