. * * @link https://www.librenms.org * @copyright 2019 Tony Murray * @author Tony Murray */ namespace LibreNMS\DB; trait SyncsModels { /** * Sync several models for a device's relationship * Model must implement \LibreNMS\Interfaces\Models\Keyable interface * * @param \App\Models\Device $device * @param string $relationship * @param \Illuminate\Support\Collection $models * @return \Illuminate\Support\Collection */ protected function syncModels($device, $relationship, $models) { $models = $models->keyBy->getCompositeKey(); $existing = $device->$relationship->keyBy->getCompositeKey(); foreach ($existing as $exist_key => $exist_value) { if ($models->offsetExists($exist_key)) { // update $exist_value->fill($models->get($exist_key)->getAttributes())->save(); } else { // delete $exist_value->delete(); $existing->forget($exist_key); } } $new = $models->diffKeys($existing); $device->$relationship()->saveMany($new); return $existing->merge($new); } }