getOrCreateResource($data); foreach ($resources as $resource) { $relation = $this->relation($resource); $relation->attach($model); } } /** * Get or Create Resource from link field. * * @param array $data * @return ExternalResource[] */ protected function getOrCreateResource(array $data): array { $resources = []; foreach ($this->sites as $resourceSite) { $link = Arr::get($data, $resourceSite->name); if (empty($link)) continue; $resource = ExternalResource::query() ->where(ExternalResource::ATTRIBUTE_LINK, $link) ->first(); if ($resource === null) { $resource = ExternalResource::query()->create([ ExternalResource::ATTRIBUTE_EXTERNAL_ID => ResourceSite::parseIdFromLink($link), ExternalResource::ATTRIBUTE_LINK => $link, ExternalResource::ATTRIBUTE_SITE => $resourceSite->value, ]); } $resources[] = $resource; } return $resources; } /** * Get the relation to the action models. * * @param ExternalResource $resource * @return BelongsToMany */ abstract protected function relation(ExternalResource $resource): BelongsToMany; }