我正在使用Zend Framework 1.7和MySQL 5.0数据库来完成我正在做的项目。系统的一部分是一个很长的形式,它要求用户提供各种日期(以dd / mm / yyyy格式)以及一些整数字段。
在我的MySQL表中,所有这些字段都默认为 null 。当我使用我的模型中的函数(扩展Zend_Db_Table)保存表单数据时,任何空白整数字段都设置为 0 ,并且任何空白日期字段都设置为 0000-00 -00 - 在这两种情况下,它们都应该 null 。
我相信这是因为Zend_Db_Table-> insert()引用了所有值,包括空值。有什么方法可以改变这种行为吗?我目前不得不循环遍历字段组,并在适当时将它们设置为null。
干杯,
马特
答案 0 :(得分:1)
尝试:
$data['shouldBeEmtpy'] = new Zend_Db_Expr('NULL');
答案 1 :(得分:1)
vartec - 感谢您的帮助。你的想法给了我一个很好的起点。我进一步开发了它,扩展了Zend_Db_Table,添加了一个从MySQL中取出列元数据的函数,并用它来设置默认值。我在下面发布了一份草稿。我还没有尝试简化它,并且只覆盖了我需要的字段类型。希望它可以帮助其他人遇到同样的问题。
public function reformatData($array) {
if (!is_array($array)) {
return false;
}
$cols = $this->info(Zend_Db_Table_Abstract::METADATA);
if (is_array($cols)) {
foreach ($cols as $col) {
if (array_key_exists($col['COLUMN_NAME'], $array)) {
switch ($col['DATA_TYPE']) {
case 'int': case 'tinyint':
if ($array[$col['COLUMN_NAME']] == '') {
$newArray[$col['COLUMN_NAME']] = new Zend_Db_Expr('null');
}
else {
$newArray[$col['COLUMN_NAME']] = $array[$col['COLUMN_NAME']];
}
break;
case 'date':
if ($array[$col['COLUMN_NAME']] == '') {
$newArray[$col['COLUMN_NAME']] = new Zend_Db_Expr('null');
}
elseif(!Zend_Date::isDate($array[$col['COLUMN_NAME']], 'YYYY-MM-dd')) {
$date = new Zend_Date($array[$col['COLUMN_NAME']], null, 'en_GB');
$newArray[$col['COLUMN_NAME']] = $date->toString('YYYY-MM-dd');
}
else {
$newArray[$col['COLUMN_NAME']] = $array[$col['COLUMN_NAME']];
}
break;
case 'datetime':
if ($array[$col['COLUMN_NAME']] == '') {
$newArray[$col['COLUMN_NAME']] = new Zend_Db_Expr('null');
}
elseif(!Zend_Date::isDate($array[$col['COLUMN_NAME']], 'YYYY-MM-dd HH:MM')) {
$date = new Zend_Date($array[$col['COLUMN_NAME']], null, 'en_GB');
$newArray[$col['COLUMN_NAME']] = $date->toString('YYYY-MM-dd HH:MM');
}
else {
$newArray[$col['COLUMN_NAME']] = $array[$col['COLUMN_NAME']];
}
break;
default:
$newArray[$col['COLUMN_NAME']] = $array[$col['COLUMN_NAME']];
break;
}
}
}
return $newArray;
}
else {
return false;
}
}