我是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”的错误。是否有一些步骤我没有这样做,因为枚举列限制了输入?
提前致谢。
答案 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中的一个来确保它在枚举中。