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
循环,用于添加默认 Created
和 LastEdited
值。这些不是必需的,但可能会有用。如果未添加,Created
和 LastEdited
值在数据库中将是 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;
}
我正在使用 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
循环,用于添加默认 Created
和 LastEdited
值。这些不是必需的,但可能会有用。如果未添加,Created
和 LastEdited
值在数据库中将是 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;
}