为了账号安全,请及时绑定邮箱和手机立即绑定

更新 laravel SQL 表,数值超出范围:

更新 laravel SQL 表,数值超出范围:

PHP
Qyouu 2023-08-19 14:30:07
我有一个正在接收传感器数据的应用程序。作为说明,假设预期范围在 0.01 到 10 之间。在这种情况下,在迁移中我可能会遇到类似的情况:$table->float('example',5, 2)这样我就能够处理超出预期范围的数量级。然而,传感器可能会出现故障并发送 10 000 个值。由于传感器正在发送一系列值,因此可能并非所有数据都不正确,因此最好仍将数据写入 DB。对于初始插入,我使用下面的代码,该代码按预期工作:DB::table($tableName)->insertOrIgnore($insert_array);然而,在某些情况下,传感器可以重新发送数据,在这种情况下需要更新记录。超出范围的值有可能保留在数组中,在这种情况下,下面的更新语句将抛出超出范围的错误:DB::table($tableName)->where('$some_id','=', $another_id)->update($insert_array);我无法找到类似于“updateorignore”功能的东西。处理更新此记录的最佳方法是什么?请注意,我不能简单地将其放入 try catch 中,因为该表将是某些子表的父表,并且忽略它会导致一些孤立的条目。
查看完整描述

2 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

您是否有一些独特的数据点将记录连接在一起,例如时间戳或数据来源的 ID?如果是这样,您可以使用updateOrInsert


DB::table($tableName)

    ->updateOrInsert(

        ['remote_id' => $insert_array['remote_id'],

        [

           'example_field_1' => $insert_array['example_field_1'],

           'example_field_2' => $insert_array['example_field_2'],

        ]

    );

查看完整回答
反对 回复 2023-08-19
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

以下是解决该问题的一些示例代码:


                $values = array();

                //set up values for binding to prevent SQL injection

                foreach ($insert_array as $item) {

                        $values[] = '?'; 

                }


                //array values need to be in a "flat array"

                $flat_values = implode(", ", $values);

                

                //add in separators ` to column names

                $columns = implode("`, `",array_keys($insert_array));


                //write sql statement

                $sql = "INSERT IGNORE INTO `example_table` (`$columns`) VALUES 

                ($flat_values) ON DUPLICATE KEY UPDATE id = '$id'";

                DB::insert($sql, array_values($insert_array));

            }


查看完整回答
反对 回复 2023-08-19
  • 2 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信