Тип перечисления Doctrine не позволяет добавлять не перечисленные значения? - PullRequest
0 голосов
/ 26 ноября 2010

Я новичок в 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» из поля выбора, я ожидаюДоктрина выдает ошибку и не вставляет эту запись, однако она будет вставлять ее с категорией «1».Есть ли какой-то шаг, который я не делаю, чтобы столбец enum ограничивал ввод?

Заранее спасибо.

1 Ответ

0 голосов
/ 26 ноября 2010

И когда я вставляю это поле как «1», в базе данных появляется буква «а» (наверное, потому что это первая буква в массиве перечислений?

Да.

Если я пропущу тарабарщину, например 'ahjkh', поле в БД будет пустым, даже если я добавлю 'notnull' => true к строке хастаблицы.Вы уверены, что у вас есть это в правильном месте? Я думаю, это должно выглядеть примерно так:

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

Так что использовать хук проверки, например, prevalidate - есть ли способполучить массив enum из определения таблицы, или мне нужно снова создать массив в этой функции и просто использовать in_array?

Определения столбцов хранятся в таблице, так что вы можете сделать что-то подобное изв экземпляре модели:

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

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

Просто для справки: fieldName - это имя свойства модели, а columnName - фактическое имя столбца.так же всегда убедитесь, что вы передаетеожидаемый при попытке получить информацию от Doctrine_Table.


Это может иметь какое-то отношение к эмулируемым или нативным enum типам, хотя я не уверен, потому что я всегда использую нативный, иэто работает.Вы также можете попробовать установить native:

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

И если это не сработает, вы можете использовать один из проверочных хуков , чтобы убедиться, что он входит в перечисление.

...