Silverstripe SQLUpdate多行

时间:2017-03-30 09:14:15

标签: php mysql sql-update silverstripe

我有以下代码(为简单起见而编辑,但我的目标是更新多个设备的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()的情况下实现此操作有任何建议吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

不,您无法使用SQLUpdate更新多行。您可以编写一个类似于this answer的原始查询,并使用DB::query运行它。

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

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

为了提高性能,我建议您使用原始SQLSelect代替Devices::get()来获取所需的值,而不是通过ORM运行。