Показать регионы и города с предложениями работы от этого - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть таблицы: Страна, Город, Регион и Joboffers. Отношения Mt выглядят так: Страна с регионом Город с регионом и Joboffers Я хочу отобразить регионы (напомните, что Region и Joboffer связаны, поэтому я хочу создать l oop внутри l oop, чтобы отображать регионы и города из что) но только если содержат предложения о работе. Посмотрите на этот запрос

    $regions = Region::where('country_id', $id)->whereHas('jobs', function($query) {
        return $query->whereHas('cities', function($quesry){
            return $quesry->where('active', 1);
        });
    })->orderBy('name', 'asc')->get();

Я покажу все модели

//Country
    public function regions(){
        return $this->hasMany("App\Regions");
    }
    public function cities(){
        return $this->hasMany("App\City");
    }
//Region
    public function country(){
        return $this->belongsTo('App\Country');
    }
    public function cities(){
        return $this->hasMany('App\City');
    }
    public function jobs(){
        return $this->hasMany('App\Joboffer');
    }
//City
    public function region(){
        return $this->belongsTo('App\Region');
    }
    public function jobs(){
        return $this->hasMany('App\Joboffer');
    }
//Joboffer
    protected $fillable = ['title', 'city_id', 'region_id', 'description', 'phone', 'photo', 'user_id', 'active'];
    public function city(){
        return $this->belongsTo('App\City');
    }
    public function region(){
        return $this->belongsTo('App\Region');
    }
    public function user(){
        return $this->belongsTo('App\User');
    }

Мой запрос не работает. Он правильно отображает регионы, но отображает все города из этого. Не только с активными предложениями. Как я могу решить мою проблему?

@ Edit

Метод моего контроллера выглядит следующим образом

public function checkCitiesFromRegion($id){
    $regions = Region::with('cities.jobs')->where('country_id', $id)->whereHas('cities', function($query) {
        $query->whereHas('jobs', function ($quesry) {
            $quesry->where('active', 1);
        });
    })->orderBy('name', 'asc')->get();
    foreach($regions as $region){
        echo $region->name . '<br>';
        foreach($region->cities as $city){
            echo $city->name;
        }
    }
}

Я не использую view, потому что я хотел протестировать этот код.

1 Ответ

0 голосов
/ 03 апреля 2020

Если я правильно понимаю, что вы хотите выбрать все регионы из данной страны, в которых есть города с активными предложениями работы, вы можете сделать что-то вроде этого:

$regions = Region::where('country_id', $id)->whereHas('cities', function($query) {
    $query->whereHas('jobs', function ($quesry) {
        $quesry->where('active', 1);
    });
});

Если вы захотите загрузить все данные отношений в том же запросе, который вы могли бы связать методом with() с вашим запросом:

$regions = Region::with('cities.jobs')->where('country_id', $id)->whereHas('cities', function($query) {
    $query->whereHas('jobs', function ($quesry) {
        $quesry->where('active', 1);
    });
});

Примечание. Нет необходимости добавлять оператор возврата к вашим запросам whereHas().

@ Edit

После вашего редактирования, где вы показываете код своего контроллера, я теперь понимаю, что происходит.

Вы получаете все регионы, в которых есть города с активными предложениями о работе, но когда вы запускаете свой для каждого l oop eloquent автоматически загружает все города для этого региона (если в них нет активных предложений о работе), поэтому вы получаете этот результат, поэтому мы должны получить все регионы, в которых есть города с активными предложениями о работе, и загружайте только эти города в свой регион. Нечто подобное должно работать:

$regions = Region::with(['cities' => function($query) {
        $query->with(['jobs' => function ($quesry) {
            $quesry->where('active', 1);
        }])->whereHas('jobs', function ($quesry) {
            $quesry->where('active', 1)
        });
    }])->where('country_id', $id)->whereHas('cities', function($query) {
    $query->whereHas('jobs', function ($quesry) {
        $quesry->where('active', 1);
    })->get();
});

Не проверял, но это должно работать. Это будет загружать только города, в которых есть активные рабочие места, и активные рабочие места в каждом регионе, в котором есть города с активными предложениями о работе.

Надеюсь, что имеет смысл ?.

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