2010-11-26 160 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))); 
    } 
} 

我有了一個選擇框和一個上傳表單視圖模型

<?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」 字母「A」的 數據庫(我猜是因爲它是枚舉數組中的 第一個字母?

是顯示出來。

如果我通過亂碼像「ahjkh」的 字段顯示爲空的分貝 即使我加入「NOTNULL」 =>真實 的hastable線。

你確定你有它在正確的位置?它應該看起來像下面,我想:

$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是列的實際名稱。兩者並不總是相同的,所以當你試圖從Doctrine_Table獲得信息時,請確保你通過了預期的。


這可能有事情做模擬與本地enum類型,雖然我不知道,因爲我一直使用本機,和它的作品了。你可以嘗試設置本機還有:

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

如果不這樣做,你可以使用validation hooks之一,以確保它在枚舉。

+0

好的 - 所以我已經添加到我的代碼點火器插件文件。當我將該字段插入'1'時,字母'a'出現在數據庫中(我猜是因爲它是枚舉數組中的第一個字母?如果我通過像'ahjkh'這樣的亂碼,字段在數據庫中顯示爲空即使我在hastable行中添加了'notnull'=> true,所以要使用驗證鉤子,比如prevalidate,有沒有辦法從表格定義中獲取枚舉數組,或者是否需要重新創建數組這個函數只是使用in_array嗎?非常感謝。 – Rapture 2010-11-26 21:05:02