Zend_Db игнорирует мои значения полей по умолчанию! - PullRequest
1 голос
/ 19 марта 2009

Я использую Zend Framework 1.7 с базой данных MySQL 5.0 для проекта, которым я занимаюсь. Часть системы представляет собой длинную форму, которая запрашивает у пользователя различные даты (в формате дд / мм / гггг), а также некоторые целочисленные поля.

В моей таблице MySQL все эти поля имеют значение по умолчанию null . Когда я прихожу, чтобы сохранить данные формы с помощью функции в моей модели (которая расширяет Zend_Db_Table), все пустые целые поля устанавливаются на 0 , а любые пустые поля даты устанавливаются на 0000-00- 00 - в обоих случаях они должны быть null .

Я полагаю, это потому, что Zend_Db_Table-> insert () цитирует все значения, включая пустые. Есть ли способ, которым я могу изменить это поведение? В настоящее время мне приходится перебирать группы полей, устанавливая их в NULL в зависимости от ситуации.

Приветствия
Matt

Ответы [ 2 ]

1 голос
/ 20 марта 2009

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 голос
/ 19 марта 2009

Попробуйте:

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