[英]Display regions and cities with job offers from that
我有表格:Country、City、Region 和 Joboffers。 Mt 關系如下所示: Country with Region City with Region 和 Joboffers 我想顯示區域(記住 Region 和 Joboffer 有關系,所以我想在循環內創建循環以從中顯示區域和城市)但前提是包含工作邀請。 看看這個查詢
$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');
}
我的查詢不起作用。 它顯示正確的地區,但顯示所有城市。 不僅有主動報價。 我該如何解決我的問題?
我的控制器方法看起來像這樣
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;
}
}
}
我不使用視圖是因為我想測試這段代碼。
如果我理解正確,您想從給定國家/地區獲取具有有效工作機會的城市的所有地區,您可以執行以下操作:
$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()
查詢中添加 return 語句。
@編輯
通過您的編輯,在您顯示控制器代碼的地方,我現在明白發生了什么。
您正在檢索具有有效工作機會的城市的所有地區,但是當您運行 for each 循環時,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();
});
尚未測試,但這應該有效。 這將僅加載有活躍工作機會的城市和每個擁有活躍工作機會城市的地區的活躍工作機會。
希望這是有道理的😉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.