2009-03-19 4 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