CsvBulkLoader仅导入/更新现有对象

时间:2015-03-16 22:47:18

标签: csv import silverstripe

我正在使用简单的CsvBulkLoader来批量更新数据对象。

class OrderImporter extends CsvBulkLoader {
    public $delimiter = ';';
    public $enclosure = '"';
    public $hasHeaderRow = true;

    public $columnMap = array(
      'ID' => 'ID',
      'Bezahlt' => 'Payed',
            'Geandert' => 'NeedReview'
    );
}

我的问题是,我不想创建新对象,如果它们在导入文件中。我只想更新现有的。

有没有办法实现这个目标?可悲的是,我在文档中找不到任何内容。

2 个答案:

答案 0 :(得分:0)

我想你会看一下CsvBulkLoader::processRecord()。这是处理每一行的地方。您可以在OrderImporter类中尝试(未经测试):

protected function processRecord($record, $columnMap, &$results, $preview = false) {
        // find existing object
        $existingObj = $this->findExistingObject($record, $columnMap);
        return ($existingObject) 
            ? parent::processRecord($record, $columnMap, $results, $preview)
            : false;
    }

HTH,wmk

答案 1 :(得分:0)

您需要根据导入文件中的数据库中已存在的字段来设置$ duplicateChecks。如果ID匹配,您可以使用:

public $duplicateChecks = array(
        'ID' => 'ID',
);

您应首先在开发服务器上测试导入,特别是如果您使用字段组合,因为结果可能与您期望的结果不同。

请参阅BulkLoader api http://api.silverstripe.org/3.1/class-BulkLoader.html

中的$ duplicateChecks