【问题标题】:CsvBulkLoader import/update only existing objectsCsvBulkLoader 仅导入/更新现有对象
【发布时间】:2015-03-16 22:47:18
【问题描述】:

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

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

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

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

有没有办法做到这一点?遗憾的是,我在文档中找不到任何内容。

【问题讨论】:

    标签: csv import silverstripe


    【解决方案1】:

    我想你应该看看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

    【讨论】:

    • 好主意,但我在进入后端后立即收到 parent::processRecordCall-time pass-by-reference has been removed 错误。
    • 即使在解决了这个错误之后,现在也没有任何东西被导入。有什么建议吗?
    【解决方案2】:

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

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

    您应该首先在开发服务器上测试导入,尤其是在您使用字段组合时,因为结果可能与您的预期不同。

    查看 BulkLoader api 中的 $duplicateChecks http://api.silverstripe.org/3.1/class-BulkLoader.html

    【讨论】:

    • 抱歉,已经有一段时间了。也许你可以帮助我,我已经收到了带有回调 ID 的重复检查。但我不知道如何继续。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    相关资源
    最近更新 更多