File: //var/www/quadcode-jobs/app/Repositories/LocationRepository.php
<?php
namespace App\Repositories;
use App\Models\LeverLocation;
use App\Models\Location;
use App\Models\LocationVacancyRelation;
use App\Models\Vacancy;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
class LocationRepository
{
private static function getQuery(): Builder
{
return LeverLocation::query();
}
public static function getLocations(): Collection
{
return self::getQuery()->where('count', '>', 0)->get();
}
public static function getCount(): int
{
return count(self::getLocations());
}
public static function sync(array $locationNames): array
{
$locations = [];
foreach ($locationNames as $title) {
$locations[] = self::getQuery()->updateOrCreate(['title' => $title], ['title' => $title]);
}
return $locations;
}
public static function relate(Vacancy $vacancy, array $locations): void
{
LocationVacancyRelation::query()->where('vacancy_id', $vacancy->id)->delete();
foreach ($locations as $location) {
$relation = new LocationVacancyRelation(['vacancy_id' => $vacancy->id, 'location_id' => $location->id]);
$relation->save();
}
}
public static function updateVacanciesCount(): void
{
$mapLocationsData = OfficeRepository::getOffices();
$mapLocations = [];
foreach ($mapLocationsData as $mapLocation) {
/** @var Location $mapLocation */
$mapLocation->count_positions = 0;
$mapLocations[$mapLocation->title] = $mapLocation;
}
$locations = LeverLocation::all();
if ($locations->isEmpty()) {
return;
}
foreach ($locations as $location) {
$count = $location->vacancies->count();
$location->update(['count' => $count]);
$country = OfficeRepository::CYPRUS === $location->title ? OfficeRepository::LIMASSOL : $location->title;
if (!empty($mapLocations[$country])) {
$mapLocations[$country]->count_positions += $count;
}
}
foreach ($mapLocations as $mapLocation) {
$mapLocation->save();
}
}
public static function getListByIds(array $ids): Collection
{
return self::getQuery()->whereIn('id', $ids)->get()->keyBy('id');
}
}