2010-11-26 9 views
0

Je suis tout nouveau à Doctrine et Code Igniter et je rencontre un problème avec l'une de mes tables.Le type enum de Doctrine n'autorise pas l'ajout de valeurs non énumérées?

J'ai un modèle que je pensais ne permettrait 4 lettres différentes (pour les tests à ce moment)

<?php 
class Photo extends Doctrine_Record 
{ 
    public function setTableDefinition() 
    { 
     $this->hasColumn('photo_path', 'string', 255, array('unique' => 'true'));  
     $this->hasColumn('category', 'enum', null, 
      array('values' => array('a', 'b', 'c', 'd')) 
     ); 
     $this->hasColumn('token', 'string', 255); 
    } 

    public function setUp() 
    {  
     $this->actAs('Timestampable');  
    } 

    public function preInsert($event) 
    { 
     $this->token = (sha1(rand(11111, 99999))); 
    } 
} 

J'ai une vue qui a une boîte de sélection et un formulaire de téléchargement

<?php echo validation_errors('<p class="error">','</p>'); ?> 
    <div id="upload"> 
     <?php 
     $categoryOptions= array(
     '' => '', 
     'a' => 'a', 
     'b' => 'b', 
     'c' => 'c', 
     '1' => '1' 
     ); 
     echo form_open_multipart('admin/addImage'); 
     echo form_upload('userfile'); 
     echo form_dropdown('letter', $categoryOptions); 
     echo form_submit('upload', 'Upload!'); 
     echo form_close();  
     ?> 
    </div> 

Lorsque je sélectionne '1' dans la boîte de sélection, je m'attendrais à ce que Doctrine lance une erreur et n'insère pas cet enregistrement, cependant il l'insérera avec une catégorie '1'. Y a-t-il un pas que je ne fais pas pour que la colonne enum limite l'entrée?

Merci d'avance.

Répondre

0

Et quand j'insérer ce champ « 1 » la lettre « a » apparaît dans la base de données (je suppose parce que c'est la première lettre dans le tableau de ENUM?

Oui.

Si je passe du charabia comme « ahjkh » le champ semble être nul dans le db même si j'ajouté « notnull » => true à la ligne hastable.

Etes-vous sûr de l'avoir au bon endroit? Il devrait ressembler à ce qui suit, je pense:

$this->hasColumn(
    'category', 
    'enum', 
    null, 
    array(
    'values' => array('a', 'b', 'c', 'd'), 
    'notnull' => true, 
    'default' => 'a' 
) 
); 

donc d'utiliser le crochet de validation, comme prevalidate - est-il ainsi un moyen de obtenir le tableau enum de la table définition, ou faire j'ai besoin de créer le tableau à nouveau dans cette fonction et juste utiliser in_array?

définitions de colonnes sont stockées sur la table afin que vous puissiez faire quelque chose comme ceci à partir d'une instance de modèle:

$enums = $this->getTable()->getEnumValues('yourEnumFieldName'); 

if(!in_array($value, $enums)){ 
    // push error to stack 
} 

Juste pour l'amour de référence un fieldName est le nom de la propriété sur le modèle et la columnName est le nom réel de la colonne. Les deux ne sont pas toujours les mêmes, donc assurez-vous toujours de passer le prévu lorsque vous essayez d'obtenir des informations à partir du Doctrine_Table.


Cela pourrait avoir quelque chose à voir avec émulé par rapport enum natifs types, bien que je ne suis pas sûr parce que je l'utilise toujours natif, et il fonctionne. Vous pouvez essayer de définir ainsi natif:

Doctrine_Manager::getInstance()->setAttribute(Doctrine_Core::ATTR_USE_NATIVE_ENUM, true); 

Et si cela ne le fait pas, vous pouvez utiliser l'un des validation hooks pour assurer qu'il est dans l'énumération.

+0

Ok - J'ai donc ajouté cela à mon fichier plugin d'allumeur de code.Et quand j'insère ce champ en '1', la lettre 'a' apparaît dans la base de données (je suppose que c'est la première lettre du tableau enum) Si je passe le charabia comme 'ahjkh' le champ semble être nul dans la base de données Même si j'ai ajouté 'notnull' => true à la ligne hastable, utiliser le hook de validation, comme prevalidate, est un moyen d'obtenir le tableau enum à partir de la définition de la table, ou dois-je refaire le tableau cette fonction et juste utiliser in_array? Merci beaucoup – Rapture

+0

Ahhh, très utile! Merci, je l'ai eu correctement dans le modèle, mais pour une raison quelconque, le notnull ne semble pas fonctionner .. Votre aide avec le getEnumValues ​​était super et m'a permis d'ajouter ma propre validation de formulaire, de sorte que tout se passe bien, merci beaucoup. – Rapture