我有以下代码(为简单起见而编辑,但我的目标是更新多个设备的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()的情况下实现此操作有任何建议吗?
非常感谢!
答案 0 :(得分:2)
不,您无法使用SQLUpdate
更新多行。您可以编写一个类似于this answer的原始查询,并使用DB::query
运行它。
在DataObject上调用write
与执行SQL更新完全不同。 write
将写入当前阶段(用于版本控制),执行验证并触发onBeforeWrite
和onAfterWrite
挂钩。
如果您真的只需要数据库更新,则运行SQLUpdate
次查询而不是write
会更快。这样可以获得一些性能。
为了提高性能,我建议您使用原始SQLSelect
代替Devices::get()
来获取所需的值,而不是通过ORM运行。