User modeli içerisinde Province (il) ve County (ilçe) için ilişki ekleyin:
public function province()
{
return $this->belongsTo(Province::class, 'il');
}
public function county()
{
return $this->belongsTo(County::class, 'ilce');
}
Ad (ilan) modeli içerisine de User modeli için ilişki ekleyin:
public function user()
{
return $this->belongsTo(User::class, 'user_id');
}
Bu şekilde yaptıktan sonra kullanıcının il ve ilçesine şöyle ulaşabilirsiniz:
$ad = Ad::find(1);
$userProvince = $ad->user->province->name;
$userCounty = $ad->user->county->name;
ya da döngü içerisinde
$ads = Ad::with(['user.province', 'user.county'])->paginate();
@foreach ($ads as $ad)
{{ $ad->user->province->name }}
@endforeach
Kullanıcının ili ve komşu illerindeki ilanları getirmek için de birkaç yol var. Bunlardan biri:
Province modeline komsu_ilanlar tablosunu pivot olarak kullanabilmesi için BelongsToMany ilişkisi eklemek:
public function neighbouringProvinces()
{
return $this->belongsToMany(Province::class, 'komsu_iller','komsu_id');
}
Bu şekilde yapınca örneğin giriş yapmış kullanıcının il id'si ve ilinin komşu illerinin id'lerini şöyle alabilirsiniz:
$province= auth()->user()->province;
$adProvinces = $province->neighbouringProvinces()->get()->add($province)->pluck('id');
Şimdi sadece bu illere ait zamanı geçmemiş ilanları çekelim:
$ads = Ad::whereIn('il', $adProvinces)->where('expires_at','>', DB::raw('NOW()'))->paginate();
Diğer bir yol ise users tablosuna provinces şeklinde bir JSON alan ekleyin. User modeli içerisinde de $casts içerisine bu provinces alanını array olarak tanımlayın (https://laravel.com/docs/6.x/eloquent-mutators#array-and-json-casting) Kullanıcının ili ve komşu illerinin id'lerini kullanıcıyı sisteme eklerken bu alana array olarak ekleyin. Sonuçta illerin sınırları kolay değişen şeyler değil 🙂 Aynı sorguyu şöyle yapabilirsiniz:
$ads = Ad::whereIn('il', auth()->user()->provinces)->where('expires_at','>', DB::raw('NOW()'))->paginate();