2010-04-07 2 views
0

У меня проблемы с функциональностью Timestampable в Doctrine 1.2.2 и 1.2.3.Doctrine unsigned validation error storage created created_at

Я получаю ошибку при попытке спасти() моя запись является:

Uncaught exception 'Doctrine_Validator_Exception' with message 'Validation failed in class XXX 1 field had validation error: * 1 validator failed on created_at (unsigned) ' in ...

Я создал соответствующее поле в таблице MySQL, как:

created_at DATETIME NOT NULL,

Тогда в setTableDefinition() У меня есть:

$this->hasColumn('created_at', 'timestamp', null, array(
     'type' => 'timestamp', 
     'fixed' => false, 
     'unsigned' => false, 
     'primary' => false, 
     'notnull' => true, 
     'autoincrement' => false, 
     )); 

который берется прямо с выхода generateModelsFromDb().

И, наконец, мой нАлАдкА() выглядит следующим образом:

public function setUp() 
{ 
    parent::setUp(); 
    $this->actAs('Timestampable', array(
            'created' => array(
                'name' => 'created_at', 
                'type' => 'timestamp', 
                'format' => 'Y-m-d H:i:s', 
                'disabled' => false, 
                'options' => array() 
           ), 
            'updated' => array(
                'disabled' => true 
           ))); 
} 

(я старался не определения всех этих полей «создал», но я получаю такую ​​же проблему.)

Я м немного тупик относительно того, что я делаю неправильно - за одну вещь, которую я не могу понять, почему доктрина будет работать под любые неподписанные чеки против «метки времени» тип данных ...

Обновлено

Я на Debian Lenny (5.0.8) с MySQL (5.0.51a-24 + lenny5O). Проблема возникает с Doctrine 1.2.3 и 1.2.2. Я заметил, что в примерах Doctrine используются столбцы TIMESTAMP MySQL, а не DATETIME, поэтому я изменил это и повторно сгенерировал, но проблема все еще повторялась. Я также подумал, что это может быть проблемой с определением MySQL, поэтому я запустил generateSqlFromModels, чтобы получить правильный SQL, но это тоже было нормально (DATETIME NOT NULL).

Я полностью тупик - вошли ошибка в доктрине JIRA, чтобы увидеть, если я могу получить это выяснял: DC-965

Любая помощь с благодарностью получил!

Alex

+0

Просто быстрое обновление по этому вопросу: чтобы попробовать альтернативный трек, я удалил определение hasColumn(), упростил действие, как только это $ this-> actAs («Timestampable»), удалил таблицу в базе данных, а затем запустил Doctrine :: createTablesFromModels(). Ошибка, которую я получил: «В двух полях были ошибки проверки: * 1 validator failed on created_at (unsigned) * 1 validator failed on updated_at (без знака)« Так что я уверен, что ошибка не что-то иное делать с определениями столбцов, либо в Доктрине, либо в MySQL. Так что же это уходит? Любая помощь оценена! –

+0

Любое обновление об этом ребята? Я попробовал еще раз со всем новым кодом и новой установкой Doctrine 1.2.3, и проблема все еще встречается –

ответ

1

Yesss решена на моем случае! И, надеюсь, на ваш случай!

Когда я начал проект я работал, я хотел по умолчанию все мои колонки были:

notnull: true 
unsigned: true 

, который можно установить в файлах конфигурации YML в Symfony или с простой PHP как: $ Manager- > setAttribute (Doctrine :: ATTR_DEFAULT_COLUMN_OPTIONS, массив ('notnull' => true, 'unsigned' => true));

И, конечно, атрибут unsigned не применяется в базе данных для столбцов строки правильно? Что заставило меня предположить, доктрина не будет заботиться ни о нем ... НЕПРАВИЛЬНО

При активации Validators: http://www.doctrine-project.org/projects/orm/1.2/docs/manual/component-overview/pl#validator, доктрина пытается проверить, что столбец строки или штампа времени/datime колонки без знака валидатор!

В моем случае удаление этого атрибута столбца по умолчанию разрешило его. И если вы не задали значения по умолчанию, возможно, вы должны установить без знака как False с помощью этого метода, а затем сделать это за столбец в определении модели, где вам это нужно.

+0

Большое спасибо Aservedio за то, что нашли время, чтобы опубликовать это. Я согласен - проблема в том, что Doctrine, кажется, передает временные метки к неподписанному валидатору, что немного сумасшедшее. Но команда Doctrine, похоже, не хочет исправлять это. В любом случае, спасибо за предложение об обходном пути - я дам вам знать, как я поеду! –

0

Ммм ... не совсем уверен, о специфике учения об этом, но, как вы отмечаете, DATETIME/TIMESTAMP не имеет дела с атрибутом UNSIGNED, так как это не числовой типа.

Я бы начал с удаления объявления UNSIGNED из определения вашей таблицы.

Надеюсь, что это поможет.

+0

Спасибо за предложение. Я попытался удалить декларацию UNSIGNED, а затем UNSIGNED и FIXED, из определение таблицы, но не повезло. –

+0

Хм ... что-то еще я заметил: почему существует длина NULL, объявленная в $ this-> hasColumn ([name], [type], [length], [options])? Просто идея, но, возможно, попробуйте удалить NULL или, возможно, объявить правильную длину поля DATETIME (8?). – Tom

+0

Нуль - это длина, которую вы должны использовать для дат и времени в Доктрине. Я пробовал 19, но никаких изменений. Также я попробовал упростить временную отметку до $ this-> actAs («Timestampable») - тогда я получил «2 поля имели ошибки проверки: * 1 валидатор с ошибкой на created_at (без знака) * 1 валидатор не выполнен на update_at (без знака)». (В таблице не было поля updated_at). Возможно, это говорит о том, что это не конкретная проблема с неподписанной проверкой, а скорее с Doctrine, не находящими столбцы? –

0

Ты определение должны следовать этому: (это из YAML)

created_atn: 
    type: timestamp(25) 
    fixed: false 
    unsigned: false 
    primary: false 
    notnull: false 
    autoincrement: false 
+0

Спасибо - я пробовал ваши ценности, но, к сожалению, я все еще получаю ту же ошибку. Очень загадочно! Спасибо в любом случае –

0

Я добавил следующий код в каталог базы и соответствующий файл. И мой вопрос решен Gor .. ТНХ

public function setUp() 
    { 
     parent::setUp(); 
     $this->actAs('Timestampable', array(
             'created' => array(
             'name' => 'created_at', 
             'type' => 'timestamp', 
             'format' => 'Y-m-d H:i:s', 
             'disabled' => false, 
             'options' => array() 
            ), 
             'updated' => array(
                 'disabled' => true 
            ))); 
    } 
+0

Это похоже на мой код, который не работает? –