get(); } public function findById(int $id): ?ClassPackage { return ClassPackage::with('units')->find($id); } public function create(array $data): ClassPackage { $unitVisibilities = $data['unit_visibilities'] ?? []; unset($data['unit_visibilities']); $package = ClassPackage::create($data); $this->syncUnitVisibilities($package, $unitVisibilities); return $package->load('units'); } public function update(int $id, array $data): ?ClassPackage { $package = $this->findById($id); if (!$package) return null; $unitVisibilities = $data['unit_visibilities'] ?? null; unset($data['unit_visibilities']); $package->update($data); if ($unitVisibilities !== null) { $this->syncUnitVisibilities($package, $unitVisibilities); } return $package->fresh('units'); } public function delete(int $id): bool { $package = ClassPackage::find($id); if (!$package) return false; return $package->delete(); } public function getAllUnitsWithVisibility(int $packageId): \Illuminate\Support\Collection { $allUnits = Unit::orderBy('fantasy_name')->get(['id', 'fantasy_name']); $package = ClassPackage::with('units')->find($packageId); $visibilityMap = $package ? $package->units->keyBy('id') : collect(); return $allUnits->map(fn($unit) => [ 'id' => $unit->id, 'fantasy_name' => $unit->fantasy_name, 'visible' => $visibilityMap->has($unit->id) ? (bool) $visibilityMap[$unit->id]->pivot->visible : true, ]); } private function syncUnitVisibilities(ClassPackage $package, array $unitVisibilities): void { $syncData = []; foreach ($unitVisibilities as $uv) { $syncData[$uv['unit_id']] = ['visible' => $uv['visible']]; } $package->units()->sync($syncData); } }