Doctrine枚举类型不允许添加非枚举值?

时间:2010-11-26 20:15:51

标签: php doctrine

我是Doctrine和Code Igniter的新手,我遇到了一个问题。

我有一个模型,我认为只允许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”的错误。是否有一些步骤我没有这样做,因为枚举列限制了输入?

提前致谢。

1 个答案:

答案 0 :(得分:0)

  

当我将该字段插入为'1'时   字母“a”出现在   数据库(我猜是因为它是   枚举数组中的第一个字母?

  

如果我像'ahjkh'那样通过乱语   db中的字段似乎为null   即使我添加'notnull'=&gt; true   可恶的线。

你确定你把它放在正确的地方吗?它应该看起来像下面这样,我想:

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

所以要使用验证钩子,比如   预验证 - 有没有办法   从表中获取枚举数组   定义,还是我需要创建   在该函数中再次使用数组   使用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中的一个来确保它在枚举中。