Подсчет количества строк по столбцу в Laravel - PullRequest
0 голосов
/ 21 сентября 2019

Я создаю приложение на 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');
    }
}

Но проблема в том, что янеобходимо подсчитать общее количество отслеженных и проверенных проектов согласно этому фильтру.Я знаю, что у меня может быть отдельный контроллер, и я могу извлечь количество отсчетов через него.Но мне нужно высушить мой код.Открыты для любых предложений.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...