validator($collection); foreach ($collection as $item) { $requirement = new Requirement(); $requirement->mergeFillable([ 'company_id', 'created_by', ]); $requirement->fill([ ...$item->toArray(), 'company_id' => Auth::user()->company_id, 'created_by' => Auth::id(), 'mailto' => [], ]); $requirement->save(); $projectIDs = array_filter(array_unique(explode(',', $item['project_ids']))); foreach ($projectIDs as $projectID) { ProjectRequirement::query()->firstOrCreate([ 'project_id' => $projectID, 'requirement_id' => $requirement->id, 'asset_id' => $item['asset_id'] ?? null, 'requirement_group_id'=> $item['requirement_group_id'] ?? null, ]); } ActionRepository::createRequirement( $requirement, ObjectAction::CREATED ); } } protected function validator(Collection $collection) { $this->validatorByCollection($collection, (new CreateOrUpdateRequest())->rules(), additional: function ($item) { if (! $item['asset_id']) { return "Asset cannot be empty."; } if ($item['plan_id']) { $plan = Plan::query()->where("asset_id", $item['asset_id'])->where("id", $item['plan_id'])->first(); if (! $plan) { return "Plans are not assets."; } } $projectIDs = array_filter(array_unique(explode(',', $item['project_ids']))); if (! $projectIDs) { return null; } $count = ProjectAsset::query()->where("asset_id", $item['asset_id'])->whereIn('id', $projectIDs)->count(); if ($count != count($projectIDs)) { return sprintf('Please select the items that are assets. Asset ID:%s, Project IDs: %s', $item['asset_id'], $item['project_ids']); } return null; }); } }