excel - 从 Excel 插入/更新 Doctrine 对象

标签 excel collections symfony1 doctrine

在我当前正在工作的项目中,我必须读取一个 Excel 文件(超过 1000 行),提取所有文件并插入/更新到数据库表。

  1. 就性能而言,最好将所有记录添加到 Doctrine_Collection 中,并在使用 fromArray() 方法后插入/更新它们,对吗?另一种可能的方法是为每一行创建一个新对象(Excel 行将是一个对象)并保存它,但我认为它的性能最差。

  2. 每次上传 Excel 时,都需要将其行与数据库中的现有对象进行比较。如果该行不作为对象存在,则应插入,否则更新。我的第一个方法是将对象和行都转换为数组(或 Doctrine_Collections);然后在执行所需操作之前比较两个数组。

有人可以建议我任何其他可能的方法吗?

最佳答案

我们最近在一个项目中使用 CSV 数据做了一些这样的事情。这相当无痛。有一个 symfony 插件 tmCsvPlugin,但我们对其进行了相当多的扩展,因此插件存储库中的版本已经过时了。必须将其添加到@TODO 列表中:)

问题 1:

我没有明确了解性能,但我猜想将记录添加到 Doctrine_Collection 然后调用 Doctrine_Collection::save() 将是最简洁的方法。我确信如果某个地方抛出异常并且您必须回滚上次保存,这会很方便..

问题2:

如果您可以使用行字段作为唯一标识符(假设是用户名),那么您可以搜索现有记录。如果找到一条记录,并假设导入的行是一个数组,请使用 Doctrine_Record::synchronizeWithArray() 更新该记录;然后将其添加到 Doctrine_Collection 中。完成后,只需调用 Doctrine_Collection::save()

一个相当粗糙的“n”就绪实现:

// set up a new collection
$collection = new Doctrine_Collection('User');

// assuming $row is an associative 
// array representing one imported row.

foreach ($importedRows as $row) {

    // try to find an existing record 
    // based on a unique identifier.
    $user = Doctrine_Core::getTable('User')
        ->findOneByUsername($row['username']);

    // create a new user record if 
    // no existing record is found.
    if (!$user instanceof User) {
        $user = new User();
    }

    // sync record with current data.
    $user->synchronizeWithArray($row);

    // add to collection.
    $collection->add($user);

}

// done. save collection.
$collection->save();

相当粗糙,但这样的东西对我来说效果很好。这是假设您可以以某种方式使用导入的行数据作为唯一标识符。

注意:如果您使用的是 sf1.2/doctrine 1.0,请警惕 SynchronizeWithArray() - 如果我没记错的话,它没有正确实现。不过它在 Doctrine 1.2 中工作得很好。

关于excel - 从 Excel 插入/更新 Doctrine 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3612467/

相关文章:

list - Scala groupby 元素类型

arrays - 当字符小于 255 时 VBA FormulaArray 范围类错误

java - List.of 给出编译错误 "The method of(char, char, char, char, char, char) is undefined for the type List"

python - 使用 python itertools 按相同的元组(时间戳)对元组列表进行分组

php - 交响乐 : error while accessing an array

php - 使用 ajax 提交数据时检测到 CSRF 攻击

mysql - 有什么方法可以在 Propel (ORM) 中使用 match against statement 吗?

excel - GetPivotData #REF 错误,数据格式问题?

vba - 通过代码在换行单元格中插入换行符

excel - AggregateFunction 中的 SSAS 设置 None 有何作用?