Silverstripe SQL更新多行

Silverstripe SQLUpdate multiple rows

我有以下代码(为简单起见进行了编辑,但我的目标是更新多个设备的 AccountID):

$devices = Device::get();
if ($devices && $devices->count())
{
    foreach ($devices as $device)
    {
        $device->AccountID = 5; 
        $device->write();
    }
}

我的问题是上面的代码在执行之前可能会花费很多时间,尤其是在有 30 台或更多设备的情况下。我正在考虑只进行一个查询,而不必一直调用 write() 函数。假设我有下面的数组,其中 ID 是要更新的设备的 ID,AccountID 是要更新的字段。是否可以使用 SQLUpdate 只有一个查询?又如何?

$values = array(
    array("ID" => 1, "AccountID" => 2),
    array("ID" => 2, "AccountID" => 12),
    array("ID" => 3, "AccountID" => 22),
    array("ID" => 4, "AccountID" => 32),
)

来自 https://docs.silverstripe.org/en/3/developer_guides/model/sql_query/ 我可以看到使用 SQLInsert 可以插入多行,但是对于 SQLUpdate 呢?如果不可能,您对如何在不为每个设备调用 write() 的情况下实现这一点有什么建议吗?

非常感谢!

不,您不能使用 SQLUpdate 更新多行。您可以使用 DB::query.

编写一个类似于 this answer 和 运行 的原始查询

在 DataObject 上调用 write 与仅执行 SQL 更新完全不同。 write 将写入当前阶段(用于版本控制),执行验证并触发 onBeforeWriteonAfterWrite 挂钩。

如果您真的只需要更新数据库,运行 SQLUpdate 查询会比 write 查询更快。这样可以使您获得一些性能。

为了获得额外的性能,我建议您还使用原始 SQLSelect 而不是 Devices::get() 来获取您需要的值,而不是通过 ORM 运行ning。