0

symfony1.4とDoctrineを使用してトランザクションのレコードを保存しています。

挿入された行は、定期的に更新されるCSVファイルからのものです。CSVのレコードがDBのレコードと一致するかどうかをチェックし、挿入しないメソッドをすでに持っています。

私が理想的にやりたいのは、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ファイルにありますか?

ありがとう

4

1 に答える 1

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;
        }
于 2012-09-24T14:44:21.777 に答える