存储created_at的Doctrine unsigned validation错误

时间:2010-04-07 18:01:01

标签: php validation doctrine

我遇到了Doctrine 1.2.2和1.2.3中的Timestampable功能问题。

我尝试保存()记录的错误是:

  

未捕获的异常'Doctrine_Validator_Exception',消息'类XXX 1字段中的验证失败,验证错误:* 1 验证者在created_at(无符号)上失败...

我在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()的输出。

最后我的setUp()看起来像:

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
                                  )));
}

(我试过没有为'created'定义所有这些字段,但我遇到了同样的问题。)

我有点难过我做错了什么 - 有一点我不明白为什么Doctrine会针对'timestamp'数据类型运行任何未签名的检查......

更新

我使用MySQL(5.0.51a-24 + lenny5O)访问Debian Lenny(5.0.8)。问题出现在Doctrine 1.2.3和1.2.2中。我注意到Doctrine的例子使用TIMESTAMP MySQL列而不是DATETIMEs,所以我改变了它并重新生成,但问题仍然存在。我还认为它可能是MySQL定义的一个问题,所以我运行generateSqlFromModels来获得正确的SQL,但这也很好(DATETIME NOT NULL)。

我完全被难倒了 - 在Doctrine JIRA中记录了一个错误,看看我是否能解决这个问题:DC-965

感激不尽的任何帮助!

亚历

4 个答案:

答案 0 :(得分:1)

Yesss解决了我的案子! 希望你的情况也好!

当我开始工作的项目时,我希望我的所有专栏都是:

notnull: true
unsigned: true

你可以在symfony的yml配置文件中设置,或者用普通的php设置: $ manager-> setAttribute(Doctrine :: ATTR_DEFAULT_COLUMN_OPTIONS,array('notnull'=> true,'unsigned'=> true));

当然,无符号属性不会在数据库中应用于字符串列吗? 这让我觉得Doctrine不关心它......错误

当您激活验证器:http://www.doctrine-project.org/projects/orm/1.2/docs/manual/component-overview/pl#validator时,Doctrine会尝试使用无符号验证器验证该字符串列或timestamp / datime列!

在我的情况下删除该默认列属性解决了它。如果你没有设置默认值,那么你可以使用该方法将unsigned设置为False,然后在你需要的模型定义中按列进行。

答案 1 :(得分:0)

嗯......不完全确定这个的学说细节,但正如你所指出的,DATETIME/TIMESTAMP不处理UNSIGNED属性,因为它不是数字类型。

我首先从表定义中删除UNSIGNED声明。

希望有所帮助。

答案 2 :(得分:0)

你的定义应该遵循这个: (来自Yaml)

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

答案 3 :(得分:0)

我已将以下代码添加到Base目录和相应的文件中。 我的问题解决了.. thx

  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
                                      )));
    }