我遇到了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
感激不尽的任何帮助!
亚历
答案 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
)));
}