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;
}
}
こんにちは、 ええ、私は現時点で似たようなことをしています。しかし、私はそれが必要な約30フィールドを持っています。私はそれらをループしていますが、あまり効率的ではありません。フィールドを変更/追加すると、コードを変更する必要があります。それ以外の方法は何ですか? – fistameeny
array_fill_keys($ emptyFields、new Zend_Db_Expr( 'NULL'))またはarray_mapを使用して、空フィールドの表現がZend_Db_Expr( 'NULL')にマッピングされているかどうかをマップします。 – vartec
他のオプションは、array_fill_keys($ allFields、new Zend_Db_Expr( 'NULL'))を使用してnull $データ配列を作成し、設定するフィールドを設定し、未設定のフィールドをnullのままにします。 – vartec