我正在使用简单的CsvBulkLoader来批量更新数据对象。
class OrderImporter extends CsvBulkLoader {
public $delimiter = ';';
public $enclosure = '"';
public $hasHeaderRow = true;
public $columnMap = array(
'ID' => 'ID',
'Bezahlt' => 'Payed',
'Geandert' => 'NeedReview'
);
}
我的问题是,我不想创建新对象,如果它们在导入文件中。我只想更新现有的。
有没有办法实现这个目标?可悲的是,我在文档中找不到任何内容。
答案 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