SilverStripe创建/插入批量记录

3

我正在使用SilverStripe开发网站。在我的项目中,我将一组DataObjects保存到数据库中。我正在通过循环遍历这个集合,并将每个对象保存到数据库中,代码如下:

foreach ($collection as $item) {
    $dbItem = Item::create();
    //assign data to $dbItem
    $dbItem->write();
}

以上代码的问题在于当我有数百条记录时,性能较慢。在SilverStripe中是否有一种批量插入或创建的方法,类似于Laravel以获得更好的性能?

看一下BulkLoader基类 - 框架中只有一个默认实现CsvBulkLoader,但你可以编写自己的实现。 - scrowler
2个回答

2
正如WMK所提到的,我们可以使用SQLInsert通过单个数据库插入调用将所有数据插入到数据库中。
以下是在SilverStripe 4中使用SQLInsert的示例。
以下代码将一个$collection数组插入到数据库中:
最初的回答:可以使用SQLInsert通过单个数据库插入调用将所有数据插入到数据库中。在SilverStripe 4中,以下代码将一个$collection数组插入到数据库中:
$insert = SilverStripe\ORM\Queries\SQLInsert::create('Item');
$insert->addRows($collection);
$insert->execute();

以下是一个示例项目集合,可插入到数据库中。添加了一个foreach循环,用于添加默认的Created和LastEdited值。这些不是必需的,但可能有用。如果未添加Created和LastEdited值,则在数据库中将为null。最初的回答如下:

以下是一个示例项目集合,可插入到数据库中。添加了一个foreach循环,用于添加默认的CreatedLastEdited值。这些不是必需的,但可能有用。如果未添加CreatedLastEdited值,则在数据库中将为null

$collection = [
    [
        'Title' => 'Item 1',
        'Content' => '<p>Content 1</p>',
    ],
    [
        'Title' => 'Item 2',
        'Content' => '<p>Content 2</p>',
    ],
    [
        'Title' => 'Item 3',
        'Content' => '<p>Content 3</p>',
    ],
];

$currentDate = date('Y-m-d H:i:s');

foreach ($collection as &$item) {
    $item['Created'] = $currentDate;
    $item['LastEdited'] = $currentDate;
}

谢谢3dgoo。这正是我想要的。 - Wai Yan Hein

1
取决于情况。当然,您可以直接将数据插入数据库,或者使用类似 SQLInsert 的东西,因为 DataObjects 依赖于相关的数据库数据。这仅在您的数据对象中没有任何幻术(例如检查重复的URL、版本等)时才有效。如果您需要添加数据到更多的表格(例如数据对象的子类),那么就会变得更加复杂。
我曾经在服务器上导入大量地理空间数据时遇到过ORM导入的问题。通常几百个对象不会有太大问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接