【问题标题】:Zend_Db is ignoring my default field values!Zend_Db 忽略了我的默认字段值!
【发布时间】:2009-03-19 16:29:49
【问题描述】:

我正在使用 Zend Framework 1.7 和 MySQL 5.0 数据库来完成我正在做的项目。系统的一部分是一个较长的表单,它要求用户提供各种日期(以 dd/mm/yyyy 格式)以及一些整数字段。

在我的 MySQL 表中,所有这些字段的默认值为 null。当我使用模型中的函数(扩展 Zend_Db_Table)来保存表单数据时,任何空白整数字段都设置为 0,任何空白日期字段都设置为 0000-00 -00 - 在这两种情况下,它们都应该是null

我相信这是因为 Zend_Db_Table->insert() 引用了所有值,包括空白值。有什么办法可以改变这种行为?我目前必须遍历字段组,并酌情将它们设置为 null。

干杯,
马特

【问题讨论】:

    标签: php zend-framework zend-db zend-db-table


    【解决方案1】:

    试试:

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

    【讨论】:

    • 嗨,是的,我现在正在做类似的事情。但是,我有大约 30 个领域需要这样做。我正在遍历它们,但效率不高。而且,如果我更改/添加任何字段,我必须更改我的代码。还有其他方法吗?
    • 使用 array_fill_keys($emptyFields, new Zend_Db_Expr('NULL')) 或 array_map 将你的空字段表示映射到 Zend_Db_Expr('NULL')。
    • 其他选项是使用 array_fill_keys($allFields, new Zend_Db_Expr('NULL')) 创建空的 $data 数组,然后设置要设置的字段,未设置的字段保持为空。跨度>
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 2011-08-26
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      相关资源
      最近更新 更多