for ($i = 0; $i < count($ids); $i++) {
ls_player_details::where('Bib_no', $ids[$i])->update(['chestno' => $chestnos[$i]]);
}
此更新查询 162 条记录需要 8 秒,因此希望减少时间
所以我做了这个;
for ($i = 0; $i < count($chestnos); $i++) {
$data[] = array('chestno' => $chestnos[$i]);
}
ls_player_details::whereIn('Bib_no', $ids)->update($data);
现在问题是什么;
现在我得到这样的数据
[
{
"chestno": 50
},
{
"chestno": 51
},
{
"chestno": 52
},
{
"chestno": 53
},
{
"chestno": 54
},
{
"chestno": 55
},
]
但我想得到类似的数组;
["chestno": 50,"chestno": 50,"chestno": 50]
问题:
使用 for 循环将同一键的多个值插入数组,
我想知道还有其他方法可以完成同样的事情。
最佳答案
正如我在评论中建议的,一种方法是使用 CASE WHEN
子句进行重构。
您应该能够使用 DB:raw
select 语句与您的 update
方法调用。
$data = '(SELECT CASE Bib_no';
foreach ($ids as $i => $id) {
if (!array_key_exists($i, $chestnos)) {
/* uncomment to prevent NULL value when $id is not in $chestnos
unset($ids[$i]);
*/
continue;
}
$data .= ' WHEN "' . $id . '" THEN "' . $chestnos[$i] . '"';
}
$data .= ' END)';
ls_player_details::whereIn('Bib_no', $ids)
->update(['chestno' => DB::raw($data)]);
示例 https://3v4l.org/tglaB
执行的查询结果应如下所示:
UPDATE ls_player_details
SET chestno = (SELECT CASE Bib_no
WHEN "a" THEN "50"
WHEN "b" THEN "51"
WHEN "c" THEN "52"
WHEN "d" THEN "53"
WHEN "e" THEN "54"
WHEN "f" THEN "55"
WHEN "g" THEN "56"
END)
WHERE Bib_no IN("a", "b", "c", "d", "e", "f", "g")
这会将 chestno
列更新为相应的 Bib_no
引用(如果已选择)。如果 CASE WHEN
子句中没有 Bib_no
匹配项,则默认为 NULL
。
关于php - 减少 Laravel 中更新查询的时间(无需 for 循环,对于相同的键和多个值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53849833/