gpt4 book ai didi

php - Silverstripe SQL更新多行

转载 作者:行者123 更新时间:2023-11-29 06:03:49 24 4
gpt4 key购买 nike

我有以下代码(为简单起见进行了编辑,但我的目标是更新多个设备的 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 更新多行。您可以编写一个原始查询,类似于 this answer并使用 DB::query 运行它。

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

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

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

关于php - Silverstripe SQL更新多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43113396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com