Eğer kullanıcının şehrini oturum değişkeni olarak tutarsanız, global scopes ile içinde şehir olan ve kullanıcının şehrine göre işlem yapılması gereken her sorguda her seferinde oturum değişkenini alıp sorguya eklemenize gerek kalmaz.
class UserCityScope implements Scope
{
/**
* Apply the scope to a given Eloquent query builder.
*
* @param \Illuminate\Database\Eloquent\Builder $builder
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public function apply(Builder $builder, Model $model)
{
$builder->where('sehir_id', session('sehir_id'));
}
}
Bu scope'u örneğin Page isimli bir modeliniz olsun, içinde sehir_id olan, ona uyguladığınızı düşünün. Bu durumda:
$pages = Page::all();
yaptığınızda sadece sehir_id'si oturum değişkeni olan sehir_id'ye eşit kayıtlar gelecektir.
Eğer sehir_id olmadan tüm kayıtları da isterseniz:
$pages = Page::withoutGlobalScope(UserCityScope::class)->get();
// ya da tüm scopları kaldırmak için
$pages = Page::withoutGlobalScopes()->get();
Böyle olunca da rotalarınızda (özellikle istemiyorsanız) şehir adlarına gerek kalmaz, abc.com/sayfa şeklinde halledersiniz. Şehir değiştirmek için de basit bir ChangeCityController gibi bir controller hazırlarsınız, içinde changeCity diye bir yöntem olur:
public function changeCity(Request $request, $cityCode)
{
$request->session()->put('sehir_id', $cityCode);
return redirect()->back();
}