2010-11-26 8 views
0

私はDoctrineとCode Igniterの新機能です。私のテーブルで問題が発生しています。Doctrine列挙型で列挙されていない値を追加することはできませんか?

私は(この時点でテスト用)4種類の文字のみを許可するだろうと思ったモデルを有する

<?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))); 
    } 
} 

Iは選択ボックスとアップロードフォーム

<?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> 
を有するビューを持っています

選択ボックスから「1」を選択した場合、Doctrineはエラーをスローし、そのレコードを挿入しないことを期待しますが、カテゴリに「1」を挿入します。列挙型列が入力を制限するように私がやっていないいくつかのステップがありますか?

ありがとうございます。

答えて

0

そして、私が「1」 文字としてそのフィールドを挿入したとき「」(それが列挙型配列の 最初の文字だから、私は推測?

はい データベースに表示されます。

i「はahjkh」のようなたわ言を渡すと フィールドには、私は「にnotnull」=> に真hastable行を追加していてもデシベル にNULLに表示されます。

正しい場所に設置してもよろしいですか?それは以下のようになるはずです、私は思う:

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

ので prevalidateのように、検証フックを使用するには - 方法 への道は、テーブル 定義から列挙型の配列を取得、または実行あり私はその機能で 配列を作り直す必要があります。 in_arrayを使うだけですか?あなたはモデルインスタンス内からこのような何かを行うことができますので

列の定義がテーブルに格納されています

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

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

だけ参照ためfieldNameは、モデルのプロパティの名前で、 columnNameは列の実際の名前です。 2つは必ずしも同じではないので、常にDoctrine_Tableから情報を取得しようとするときに期待通りのものを渡すようにしてください。


私はわからないが、私は常にネイティブ使用し、それがうまくいくので、これは、ネイティブenum種類の対エミュレートとは何かを持っている可能性があります。

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

そして、それはそれをしないならば、あなたはそれが列挙してあります確保するために validation hooksのいずれかを使用できます。あなたにもネイティブを設定してみてください可能性があります。

+0

私はコードイグナイタプラグインファイルに追加しました。そして、 '1'としてそのフィールドを挿入すると、 'a'という文字列がデータベースに現れます(enum配列の最初の文字だからでしょうか? 'ahjkh'のようなぎこちない文字列を渡すと、 harnable行に 'notnull' => trueを追加したにもかかわらず、prevalidateのような検証フックを使用するには、テーブル定義からenum配列を取得する方法がありますか?その機能とちょうどin_arrayを使用していますか?ありがとうたくさんありがとう – Rapture

+0

ああ、非常に役立つ!ありがとう。私はモデルで正しく持っていたが、何らかの理由でnotnullだけで動作していないようです。私自身のフォーム検証を追加することができました。 – Rapture