SilverStripe 创建/插入批量记录

SilverStripe create / insert bulk records

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

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

上面代码的问题是当我有数百条记录时,它在性能方面很慢。

在 SilverStripe 中有没有像 Laravel 那样批量插入或创建以获得更好性能的方法?

视情况而定。当然你可以将数据直接插入到数据库中,或者使用 SQLInsert 之类的东西,因为 DataObjects 依赖于相关的数据库数据。这仅在您的数据对象中没有任何魔法时才有效,例如检查重复的 URL、版本控制等。如果您需要将数据添加到更多表(例如,对于数据对象的子类),它会变得更加复杂。

我只有一次在我的服务器上导入 ORM 时遇到问题,当时我不得不导入大量地理空间数据。通常一些百搭的东西应该没有那么重要。

如 WMK 所述,我们可以使用 SQLInsert 通过单个数据库插入调用将所有数据插入数据库。

这是一个如何在 SilverStripe 4 中使用 SQLInsert 的例子。

下面将一个 $collection 数组插入数据库:

$insert = SilverStripe\ORM\Queries\SQLInsert::create('Item');
$insert->addRows($collection);
$insert->execute();

以下显示了要插入数据库的项目集合示例。添加了一个 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;
}