2009-03-19 8 views
1

Ich benutze Zend Framework 1.7 mit einer MySQL 5.0 Datenbank für ein Projekt, das ich mache. Ein Teil des Systems ist ein längliches Formular, das einen Benutzer nach verschiedenen Daten (im TT/MM/JJJJ-Format) sowie einigen ganzzahligen Feldern fragt.Zend_Db ignoriert meine Standardfeldwerte!

In meiner MySQL-Tabelle haben alle diese Felder einen Standardwert von null. Wenn ich die Formulardaten mit einer Funktion in meinem Modell speichern möchte (die Zend_Db_Table erweitert), werden alle leeren Ganzzahlenfelder auf gesetzt, und alle leeren Datumsfelder werden auf 0000-00-00 gesetzt - in beiden Fällen Sie sollten null sein.

Ich glaube, das liegt daran, dass Zend_Db_Table-> insert() alle Werte zitiert, einschließlich leerer. Kann ich dieses Verhalten irgendwie ändern? Momentan muss ich Gruppen von Feldern durchlaufen und sie auf Null setzen.

Cheers,
Matt

Antwort

1

vartec - Danke für Ihre Hilfe. Ihre Ideen gaben mir einen guten Ausgangspunkt. Ich habe es weiter entwickelt und Zend_Db_Table erweitert, indem ich eine Funktion hinzugefügt habe, die die Spalten-Metadaten aus MySQL herauszieht und damit Standardwerte setzt. Ich habe unten einen groben Entwurf davon gepostet. Ich habe noch keinen Versuch unternommen, sie zu vereinfachen, und habe nur die Feldtypen, die ich sofort brauche, abgedeckt. Hoffentlich könnte es anderen helfen, das gleiche Problem zu haben.

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

Versuchen:

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

Hallo, Ja, ich mache etwas ähnliches im Moment. Allerdings habe ich ungefähr 30 Felder, die es tun müssen. Ich lese sie durch, aber es ist nicht sehr effizient. Und wenn ich Felder ändere/hinzufüge, muss ich meinen Code ändern. Irgendwelche anderen Möglichkeiten, um es herum? – fistameeny

+0

Benutze array_fill_keys ($ emptyFields, neues Zend_Db_Expr ('NULL')) oder array_map, um die Darstellung des leeren Feldes nach Zend_Db_Expr ('NULL') abzubilden. – vartec

+0

Andere Option besteht darin, ein null $ Datenarray mit array_fill_keys ($ allFields, neues Zend_Db_Expr ('NULL')) zu erstellen, dann setzen Sie Felder, die Sie setzen wollen, und nicht gesetzte Felder bleiben null. – vartec