1

私が行っているプロジェクトの MySQL 5.0 データベースで Zend Framework 1.7 を使用しています。システムの一部は、ユーザーにさまざまな日付 (dd/mm/yyyy 形式) といくつかの整数フィールドを要求する長めの形式です。

私の MySQL テーブルでは、これらすべてのフィールドのデフォルトはnullです。モデル (Zend_Db_Table を拡張) で関数を使用してフォーム データを保存すると、空白の整数フィールドは0に設定され、空白の日付フィールドは0000-00-00に設定されます。どちらの場合も、次のようにする必要があります。ヌル

これは、Zend_Db_Table->insert() が空白の値を含むすべての値を引用しているためだと思います。この動作を変更する方法はありますか? 現在、フィールドのグループをループして、必要に応じて null に設定する必要があります。

乾杯、
マット

4

2 に答える 2

1

試す:

$data['shouldBeEmtpy'] = new Zend_Db_Expr('NULL');
于 2009-03-19T17:00:18.347 に答える
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;
    }
}
于 2009-03-20T11:21:27.703 に答える