добавил скоуп для отбора по городам

This commit is contained in:
developer 2026-04-24 16:15:58 +08:00
parent fd7a9bb86d
commit 484e364831
5 changed files with 112 additions and 8 deletions

View File

@ -4,6 +4,7 @@
use Modules\Main\Models\Company\Company; use Modules\Main\Models\Company\Company;
use Modules\Main\Models\Company\CompanyAdmin; use Modules\Main\Models\Company\CompanyAdmin;
use Modules\CityManager\Models\CityManager; use Modules\CityManager\Models\CityManager;
use Modules\Main\Models\City;
use Modules\Main\Models\Agent\Agent; use Modules\Main\Models\Agent\Agent;
use Modules\Main\Models\Complex; use Modules\Main\Models\Complex;
use Modules\User\Models\Role; use Modules\User\Models\Role;
@ -62,7 +63,8 @@ function GetAvailableAgents($resultType = 'Collection')
return $agents->get(); return $agents->get();
} else { } else {
return $agents; return $agents;
}; }
;
} }
} }
@ -93,7 +95,8 @@ function GetAvailableCompanies($resultType = 'Collection')
return $companies->get(); return $companies->get();
} else { } else {
return $companies; return $companies;
}; }
;
} }
} }
@ -123,7 +126,33 @@ function GetAvailableComplexes()
if (!function_exists('GetAvailableCities')) { if (!function_exists('GetAvailableCities')) {
function GetAvailableCities() function GetAvailableCities()
{ {
$agents = []; $user = auth()->user();
if ($user->hasRole(Role::SUPER_ADMIN)) {
return City::all();
}
if ($user->hasRole(Role::CITY_MANAGER)) {
$cititesOfManager = CityManager::where('user_id', $user->id)->pluck('city_id')->get();
if ($cititesOfManager->count()) {
return City::whereIn('id', $cititesOfManager)->get();
}
return false;
}
if ($user->hasRole(Role::COMPANY_ADMIN)) {
$adminCompany = AdminCompanyOfUser();
if ($adminCompany->count()) {
return City::where('id', $adminCompany->city_id)->get();
}
return false;
}
if ($user->hasRole(Role::AGENT)) {
$agentCompany = AgentCompanyOfUser();
if ($agentCompany->count()) {
return City::where('id', $agentCompany->city_id)->get();
}
return false;
}
return false;
/*$agents = [];
if ($adminCompany = AdminCompanyOfUser()) { if ($adminCompany = AdminCompanyOfUser()) {
$agents = Agent::where('company_id', $adminCompany->id); $agents = Agent::where('company_id', $adminCompany->id);
} else { } else {
@ -136,6 +165,6 @@ function GetAvailableCities()
} }
$agents->with('company:id,name'); $agents->with('company:id,name');
$agents->with('user:id,name'); $agents->with('user:id,name');
return $agents->get(); return $agents->get();*/
} }
} }

View File

@ -0,0 +1,32 @@
<?php
namespace Modules\Main\Models\Scopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class CityScope implements Scope
{
/**
* Apply the scope to a given Eloquent query builder.
*/
public function apply(Builder $builder, Model $model): void
{
if ($model->cities()->count()) { //если города для новости установлены
if ($cities = GetAvailableCities()) { //получаю доступные пользователю города
$citiesIds = [];
foreach ($cities as $city) {
$citiesIds[] = $city->id;
}
$builder->whereHas('cities', fn($q) => $q->whereIn('cities.id', $citiesIds));
} else {
$builder->where('id', 0);//не знаю, как сделать, чтобы выбор был гарантированно пустой
}
} else {
}
//$builder->where('created_at', '<', now()->minus(years: 2000));
}
}
?>

View File

@ -6,6 +6,8 @@
use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Database\Eloquent\Relations\MorphMany;
use Illuminate\Database\Eloquent\Relations\MorphOne; use Illuminate\Database\Eloquent\Relations\MorphOne;
use Modules\Main\Models\CityAppend; use Modules\Main\Models\CityAppend;
use Modules\Main\Models\City;
use Modules\User\Models\User;
trait CityAppendTrait trait CityAppendTrait
{ {
@ -14,9 +16,13 @@ public function cities(): MorphMany
return $this->MorphMany(CityAppend::class, 'append'); return $this->MorphMany(CityAppend::class, 'append');
} }
public function byCity(Builder $query, $cityId) public function byCity()
{ {
//return $query->where('category', $category); //return $query->where('category', $category);
$user = null;
settype($user, User::class);
$user = auth()->user();
return true;
} }
} }

View File

@ -3,16 +3,18 @@
namespace Modules\Post\Models; namespace Modules\Post\Models;
use Modules\Main\Models\City; use Modules\Main\Models\City;
use Modules\Post\Models\PostCity;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Database\Eloquent\Relations\HasManyThrough;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Modules\Main\Traits\CityAppendTrait; use Modules\Main\Models\Scopes\CityScope;
class Post extends Model class Post extends Model
{ {
use HasFactory; use HasFactory;
use CityAppendTrait;
protected $fillable = [ protected $fillable = [
'name', 'name',
@ -21,4 +23,21 @@ class Post extends Model
'category', 'category',
'image' 'image'
]; ];
protected static function booted(): void
{
static::addGlobalScope(new CityScope);
}
public function cities(): HasManyThrough
{
return $this->hasManyThrough(
City::class,
PostCity::class,
'post_id',
'id',
'id',
'city_id'
);
}
} }

View File

@ -0,0 +1,18 @@
<?php
namespace Modules\Post\Models;
use Modules\Main\Models\City;
use Illuminate\Database\Eloquent\Model;
use Modules\Main\Models\Scopes\CityScope;
class PostCity extends Model
{
protected $fillable = [
'post_id',
'city_id',
];
}