【问题标题】:Checking how many fields have changed upon saving a form检查保存表单时更改了多少字段
【发布时间】:2012-09-24 14:39:34
【问题描述】:

我正在使用 symfony1.4 和 Doctrine 保存交易记录。

插入的行来自定期更新的 CSV 文件。我已经有一个方法可以检查 CSV 中的记录是否与数据库中的记录匹配并且不插入。

不过,我最理想的做法是设置一个用户 flash,告诉他们在导入 CSV 文件时更新了多少行。

            $conn = ProductTable::getInstance()->getConnection();
            $conn->beginTransaction();

            try {
                $row = 1;
                while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                    if ($row > 1) {
                        $values = array(
                            'blah'            => null
                        );

                        $obj= ProductTable::getInstance()->findOrCreateNewProduct(
                            $values['blah']
                        );


                        $obj->merge($values);
                        $obj->save($conn);
                    }

                    $row++;
                }

                $conn->commit();

            } catch (Doctrine_Exception $e) {
                $conn->rollback();

                throw $e;
            }

我想知道如何获得这些更新的字段。是在actions.class.php 中还是在实际的form.class.php 文件中?

谢谢

【问题讨论】:

    标签: symfony1 symfony-1.4 doctrine-1.2


    【解决方案1】:

    您可以调用Doctrine_Record::getModified(),它会为您提供一个修改过的字段数组(尽管这对您来说无关紧要)。然后您可以在返回的数组上调用 count 并在循环之外保留累积总数。

            $conn = ProductTable::getInstance()->getConnection();
            $conn->beginTransaction();
            $nbModified = 0;
    
            try {
                $row = 1;
                while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                    if ($row > 1) {
                        $values = array(
                            'blah'            => null
                        );
    
                        $obj= ProductTable::getInstance()->findOrCreateNewProduct(
                            $values['blah']
                        );
    
    
                        $obj->merge($values);
                        $nbModified += count($obj->getModified());
                        $obj->save($conn);
                    }
    
                    $row++;
                }
    
                $conn->commit();
    
                // return $nbModified or otherwise do something with it here
    
            } catch (Doctrine_Exception $e) {
                $conn->rollback();
                // youre rolling back so just for consistency set $nbModified to zero
                $nbModified = 0;
    
                throw $e;
            }
    

    【讨论】:

    • 我应该把 `Doctrine_Record::getModified()' 放在哪里?在循环内?谢谢
    • 当我更新我的 CSV 字段并重新上传时似乎工作。谢谢。
    • 与主记录一样,您是否也在保存或包括对关系的更新?
    • 好吧,假设我的数据库中有 10 行。 CSV 文件有 5 个。如果我随后解析 CSV 并且 CSV 中的 3 行与 db 中的不同,那么我想使用 Flash 消息将“3 行已更新”推送给用户。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2015-06-07
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多