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

我有一个正在接收传感器数据的应用程序。作为说明,假设预期范围在 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 中,因为该表将是某些子表的父表,并且忽略它会导致一些孤立的条目。


Qyouu
浏览 142回答 2
2回答

侃侃无极

您是否有一些独特的数据点将记录连接在一起,例如时间戳或数据来源的 ID?如果是这样,您可以使用updateOrInsertDB::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'],        ]    );

拉丁的传说

以下是解决该问题的一些示例代码:                $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));            }
打开App,查看更多内容
随时随地看视频慕课网APP