Я создаю приложение на Laravel 6.0.2
.У меня есть поисковая система projects
в качестве модели, поэтому моя Project
модель выглядит так:
class Project extends Model {
use SoftDeletes;
protected $fillable = [
'user_id','koshy_id', 'name', 'slug', 'latitude', 'longitude',
'landmark', 'city', 'district', 'state', 'pin_code', 'region_id', 'country', 'building_use',
'sector', 'conxn_id', 'parent_project_id', 'website', 'project_logo', 'tracked', 'verified', 'status','area'
];
public function status()
{
return $this->hasOne('App\LatestStatus',
'project_id','id')->orderBy('id','desc');
}
public function technicalDescription()
{
return $this->hasOne('App\TechnicalDescription','project_id','id');
}
public function documents()
{
return $this->hasMany('App\Document','project_id','id');
}
public function coverage()
{
return $this->hasMany('App\Coverage','project_id','id');
}
public function city()
{
return $this->belongsTo('App\City','city','id');
}
public function country()
{
return $this->belongsTo('App\Country','country','id');
}
public function district()
{
return $this->belongsTo('App\District','district','id');
}
public function state()
{
return $this->belongsTo('App\State','state','id');
}
public function region()
{
return $this->belongsTo('App\Region','region_id','id');
}
public function sector()
{
return $this->belongsTo('App\Sector','sector','id');
}
}
У меня есть черта, которая убирает количество проектов, связанных с моделью:
trait ProjectCount {
public function scopeProjectCount($query)
{
$request = app()->make('request');
return $query->withCount(['projects' => function($q) use($request) {
$q->where('status', 'saved')
->when( $request->name , function( $q) use( $request ) {
$q->where('name', 'like', '%' . $request->name .'%');
})
->when($request->tracked , function( $q) use( $request ){
$q->where('tracked' , 1 );
})
->when($request->verified , function( $q) use( $request ){
$q->where('verified' , 1 );
})
->when($request->district, function ($q) use($request) {
$q->whereHas('district', function ($q) use ($request) {
$district = $request->district ? District::find( $request->district ) : NULL;
$q->whereIn('name', $district->name );
});
})
->when($request->city, function ($q) use($request ) {
$q->whereHas('city', function ($q) use($request) {
$city = City::find( $request->city );
$q->where('name', $city->name );
});
})
->when($request->state, function ($q) use($request ) {
$q->whereHas('state', function ($q) use($request) {
$state = $request->state ? State::whereIn('id', collect($request->state)->pluck('id'))->get() : NULL;
$q->whereIn('name', $state->pluck('name'));
});
})
->when($request->region, function ($q) use($request ) {
$q->whereHas('region', function ($q) use($request) {
$region = $request->region ? Region::whereIn('id', collect($request->region)->pluck('id'))->get() : NULL;
$q->whereIn('name', $region->pluck('name'));
});
})
->when($request->sector, function ($q) use($request ) {
$q->whereHas('sector', function ($q) use($request) {
$sector = $request->sector ? Sector::whereIn('id', $request->sector)->get() : NULL;
$q->where('name', $sector->pluck('name'));
});
})
->when($request->status, function ($q) use($request) {
$q->whereHas('latestStatus', function ($q) use($request){
$q->whereHas('status', function ($q) use($request) {
$projectStatus = $request->status ? ProjectStatus::whereIn( 'id', collect($request->status)->pluck('id') )->whereNull('parent_id')->get() : NULL;
$q->whereIn('name', $projectStatus->pluck('name') );
});
});
});
}])->get();
}
}
Он работает для подсчета по таким моделям, как Sector
, 'Штат ,
Город` и т. Д. ... Как я могу использовать:
class State extends Model {
use SoftDeletes, ProjectCount;
protected $fillable = ['name', 'country_id'];
public function projects()
{
return $this->hasMany('App\Project','state','id');
}
}
Но проблема в том, что янеобходимо подсчитать общее количество отслеженных и проверенных проектов согласно этому фильтру.Я знаю, что у меня может быть отдельный контроллер, и я могу извлечь количество отсчетов через него.Но мне нужно высушить мой код.Открыты для любых предложений.
Спасибо.