我正在编写一个脚本,该脚本从第三方合作伙伴读取XML并将数据放在数据库表中。我无法控制内容的长度或质量。我想避免添加逻辑来检查每个字段的长度。
例如:我在varchar(255)类型的mysql数据库中有一个列,XML导入的值大于255个字符。我希望Doctrine插入前255个字符而不是抛出Doctrine_Validator_Exception,并在消息“标题(长度)上1个验证器失败”
使用Doctrine 1.2
答案 0 :(得分:1)
我知道你说你“想避免添加逻辑来检查每个字段的长度”,但你没有说明这是出于性能原因,还是因为有很多,而你不想写代码单独。如果是后者,我会在Doctrine Record中使用类似的东西:
function set($fieldName, $value, $load = true) {
switch($fieldName) {
case 'id':
case 'foo':
case 'bar':
// list all of the fields that you DON'T want to truncate in this section
break;
default:
$value = substr($value, 0, 255);
}
parent::set($fieldName, $value, $load);
}
此函数会覆盖Record上的默认set()方法。它会将所有字段截断为255个字符,这些字符与第一部分(id,foo,bar)中列出的字符不匹配。
如果那不是您想要的,您可以让MySQL进行截断,如果您写过列长度(1265 | Data truncated for column 'xxx' at row 1
),它会发出警告,但是当查询完成时,Doctrine会将其丢弃。为此,您可以将列类型从“string”更改为“blob”,并将第二个参数设置为null而不是列长度,然后在MySQL中设置适当的限制。