Files

88 lines
2.5 KiB
PHP
Raw Permalink Normal View History

2026-03-15 17:08:23 +07:00
<?php
declare(strict_types=1);
namespace Modules\RestaurantDelivery\Traits;
use Illuminate\Database\Eloquent\Builder;
use Modules\Authentication\Models\Restaurant;
trait HasTenant
{
/**
* Boot the trait and add global scope for restaurant_id
*/
public static function bootHasRestaurant(): void
{
// Global scope: filter by restaurant_id automatically
static::addGlobalScope('restaurant', function (Builder $builder) {
if (! config('restaurant-delivery.multi_restaurant.enabled')) {
return;
}
$restaurantId = static::getCurrentRestaurantId();
if ($restaurantId) {
$builder->where('restaurant_id', $restaurantId);
}
});
// Auto-fill restaurant_id on creating
static::creating(function ($model) {
if (! config('restaurant-delivery.multi_restaurant.enabled')) {
return;
}
$column = config('restaurant-delivery.multi_restaurant.restaurant_column', 'restaurant_id');
if (empty($model->{$column})) {
$model->{$column} = static::getCurrentRestaurantId();
}
});
}
/**
* Get the current restaurant ID from request, auth, or session
*/
public static function getCurrentRestaurantId(): ?int
{
// Option 2: From authenticated user
if (auth()->check() && method_exists(auth()->user(), 'getRestaurantId')) {
return auth()->user()->getRestaurantId();
}
// Option 3: From session
if (session()->has('restaurant_id')) {
return session('restaurant_id');
}
return null;
}
/**
* Remove the global restaurant scope
*/
public function scopeWithoutRestaurant(Builder $query): Builder
{
return $query->withoutGlobalScope('restaurant');
}
/**
* Query explicitly for a specific restaurant
*/
public function scopeForRestaurant(Builder $query, int $restaurantId): Builder
{
return $query->withoutGlobalScope('restaurant')
->where(config('restaurant-delivery.multi_restaurant.restaurant_column', 'restaurant_id'), $restaurantId);
}
/**
* Relationship to Restaurant model
*/
public function restaurant()
{
$restaurantModel = config('restaurant-delivery.multi_restaurant.restaurant_model', Restaurant::class);
return $this->belongsTo($restaurantModel, 'restaurant_id');
}
}