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
将写入当前阶段(用于版本控制),执行验证并触发 onBeforeWrite
和 onAfterWrite
挂钩。
如果您真的只需要更新数据库,运行 SQLUpdate
查询会比 write
查询更快。这样可以使您获得一些性能。
为了获得额外的性能,我建议您还使用原始 SQLSelect
而不是 Devices::get()
来获取您需要的值,而不是通过 ORM 运行ning。
我有以下代码(为简单起见进行了编辑,但我的目标是更新多个设备的 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
.
在 DataObject 上调用 write
与仅执行 SQL 更新完全不同。 write
将写入当前阶段(用于版本控制),执行验证并触发 onBeforeWrite
和 onAfterWrite
挂钩。
如果您真的只需要更新数据库,运行 SQLUpdate
查询会比 write
查询更快。这样可以使您获得一些性能。
为了获得额外的性能,我建议您还使用原始 SQLSelect
而不是 Devices::get()
来获取您需要的值,而不是通过 ORM 运行ning。