4 votes

Cakephp + support des enum : impossible de sauvegarder ou de sélectionner les enum 0 et 1

Lorsque j'enregistre des données ayant deux champs d'énumération pour gérer le statut du message, c'est-à-dire lu ou non lu par l'utilisateur. J'utilise l'enum ('1', '0') pour gérer le statut '1' => lu et '0' => non lu.

Le code suivant enregistrera le message mais dans la colonne d'état, il enregistrera un fichier vide.

$data = array(
              'message' => 'test message',
              'status' => 1
             );

$this->Message->save($data);

La structure de la base de données est la suivante

Field                Type                  Collation          Null    Key     Default 
------------------  -------------        -----------------  ------  ------  -------  
id                   bigint(20)            (NULL)             NO      PRI     (NULL)   
message              varchar(255)          (NULL)             NO      MUL     (NULL)                                                         
status               enum('0','1')         latin1_swedish_ci  NO      MUL     0 

même si j'ai utilisé un tableau de données comme

$data = array(
              'message' => 'test message',
              'status' => '1'
             );

$data = array(
              'message' => 'test message',
              'status' => "'".1."'"
             );

4voto

Tim Joyce Points 2733

Dans la documentation MySql, on peut lire ce qui suit : "Comme expliqué plus loin dans cette section, nous vous recommandons fortement de ne pas utiliser de nombres comme valeurs d'énumération".

http://dev.mysql.com/doc/refman/5.0/en/enum.html

4voto

mark Points 15535

Vous utilisez cakephp - il ne supporte pas ENUM (comme documenté). Et dans votre cas, c'est même une erreur d'utiliser les enums en premier lieu. Les enums sont utilisés pour plus de deux états et devraient être émulés comme ArrayDatasource ou dans votre modèle (comme je le fais).

Mais "lu/non lu" est un booléen (deux états définis !).

et il existe un moyen simple de le faire correctement :

tinyint(1) [unsigned] [default 0]

Le gâteau supposera automatiquement qu'il s'agit d'un booléen et transformera le champ de formulaire correspondant en une case à cocher.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X