From b38a8e2b5a04ec106dc51f7d90f83122287749b6 Mon Sep 17 00:00:00 2001 From: Tony Murray Date: Thu, 23 Dec 2021 15:24:53 -0600 Subject: [PATCH] Remove extra rows with duplicate keys in SyncsModels trait (#13632) Fixes issues with bad data being left in the DB if it has a duplicate key somehow. --- LibreNMS/DB/SyncsModels.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/LibreNMS/DB/SyncsModels.php b/LibreNMS/DB/SyncsModels.php index f7692e8d38..951535ee3e 100644 --- a/LibreNMS/DB/SyncsModels.php +++ b/LibreNMS/DB/SyncsModels.php @@ -41,15 +41,23 @@ trait SyncsModels protected function syncModels($device, $relationship, $models): Collection { $models = $models->keyBy->getCompositeKey(); - $existing = $device->$relationship->keyBy->getCompositeKey(); + $existing = $device->$relationship->groupBy->getCompositeKey(); - foreach ($existing as $exist_key => $exist_value) { + foreach ($existing as $exist_key => $existing_rows) { if ($models->offsetExists($exist_key)) { // update - $exist_value->fill($models->get($exist_key)->getAttributes())->save(); + foreach ($existing_rows as $index => $existing_row) { + if ($index == 0) { + $existing_row->fill($models->get($exist_key)->getAttributes())->save(); + } else { + // delete extra rows at this key + $existing_row->delete(); + $existing_rows->forget($index); + } + } } else { // delete - $exist_value->delete(); + $existing_rows->each->delete(); $existing->forget($exist_key); } } @@ -57,7 +65,7 @@ trait SyncsModels $new = $models->diffKeys($existing); $device->$relationship()->saveMany($new); - return $existing->merge($new); + return $existing->map->first()->merge($new); } /**