yusufc
Önce RegionCity modelini Pivot haline getirin:
https://laravel.com/docs/8.x/eloquent-relationships#defining-custom-intermediate-table-models
class RegionCity extends \Illuminate\Database\Eloquent\Relations\Pivot
{
protected $table = 'region_cities';
public function region(): BelongsTo
{
return $this->belongsTo(Region::class);
}
public function city(): BelongsTo
{
return $this->belongsTo(City::class);
}
}
Bu pivot modelin migrasyonu şu şekilde olur:
Schema::create('region_cities', function (Blueprint $table) {
$table->foreignId('region_id')->constrained('regions')->onDelete('cascade');
$table->foreignId('city_id')->constrained('cities')->onDelete('cascade');
$table->boolean('status');
// Bu şekilde bir composite index hem sorguları hızlandıracak
// hem de aynı kaydın iki kez işlenmesine engel olacaktır:
$table->primary(['region_id', 'city_id']);
});
---
Region modeli içine:
https://laravel.com/docs/8.x/eloquent-relationships#many-to-many
public function cities(): BelongsToMany
{
return $this->belongsToMany(City::class, 'region_cities', 'region_id', 'city_id')
->using(RegionCity::class)
->withPivot([
'status'
]);
}
public function activeCities(): BelongsToMany
{
return $this->cities()
->wherePivot('status', true);
}
---
Country modeline bakalım. Country::where('status',true)->orderby('country')->get();
şeklinde çekmişsiniz, belli ki hep bu şekilde çekeceksiniz. O yüzden buna global bir scope yazılabilir:
https://laravel.com/docs/8.x/eloquent#global-scopes
Country modeli içine:
protected static function booted()
{
static::addGlobalScope('active', function (Builder $builder) {
$builder->where('status', true)
->orderBy('country');
});
}
Artık $countries = Country::all();
yaptığınızda her zaman istediğiniz şekilde gelecek. Eğer olur da bunu bir yerde istemezseniz $countries = Country::withoutGlobalScope('active')->get();
yapabilirsiniz.
Şimdi sizin koda gelelim:
public function getRegionCities(Request $request)
{
$region = Region::findOrFail($request->input('region_id'));
$countries = Country::all();
// Artık cities.blade.php içerisinde aktif şehirlere
// $region->activeCities şekline ulaşabilirsiniz
return view('regions.cities', compact('countries', 'region'));
}
---
Bir Region altına bir City nasıl ekliyorsunuz bilmiyorum ama many-to-many yani BelongsToMany kullandığınızda şu şekilde ekleniyor:
https://laravel.com/docs/8.x/eloquent-relationships#updating-many-to-many-relationships
$region->cities()->attach($cityId, [
'status' => $status
]);
İstediğiniz şey kabaca Laravel'de böyle yapılıyor...