2009-03-19 11 views
1

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

私のMySQLテーブルでは、これらすべてのフィールドのデフォルト値はnullです。私のモデル(Zend_Db_Tableを継承しています)の関数でフォームデータを保存する場合、空白の整数フィールドはに設定され、空白の日付フィールドは0000-00-00に設定されますnullである必要があります。

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

乾杯、
マット

答えて

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; 
    } 
} 
1

試してみてください。

$data['shouldBeEmtpy'] = new Zend_Db_Expr('NULL'); 
+0

こんにちは、 ええ、私は現時点で似たようなことをしています。しかし、私はそれが必要な約30フィールドを持っています。私はそれらをループしていますが、あまり効率的ではありません。フィールドを変更/追加すると、コードを変更する必要があります。それ以外の方法は何ですか? – fistameeny

+0

array_fill_keys($ emptyFields、new Zend_Db_Expr( 'NULL'))またはarray_mapを使用して、空フィールドの表現がZend_Db_Expr( 'NULL')にマッピングされているかどうかをマップします。 – vartec

+0

他のオプションは、array_fill_keys($ allFields、new Zend_Db_Expr( 'NULL'))を使用してnull $データ配列を作成し、設定するフィールドを設定し、未設定のフィールドをnullのままにします。 – vartec

関連する問題