Laravel 在 Model 中,於 boot 給予全域的約束
新增全域範圍後,在指定的條件下,ORM查詢將會自動加增 shop_id 的條件

全域範圍
<?php
namespace App\Scopes;
use App\Models\Shop;
use Illuminate\Support\Facades\Auth;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class ShopScope 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)
{
if (Auth::user() instanceof Shop || request()->isShop()) {
$modelTableName = $model->getTable();
return $builder->where('shop_id', optional(Auth::user()->currentTeam)->organization->id);
}
return $builder;
}
}
// Model 的 boot
protected static function boot()
{
parent::boot();
static::addGlobalScope(new ShopScope);
}
全域範圍 – 給予命名
static::addGlobalScope('active', function(Builder $builder) {
$builder->where('is_active', '=', 1)
});
排除全域範圍
Order::withoutGlobalScope('actvie')->get(); // 單一
Order::withoutGlobalScope(ActiveScope::class)->get(); // 單一
Order::withoutGlobalScope([ActiveScope::class, DisplayScope::class])->get(); // 多個
Order::withoutGlobalScope()->get(); // 全部
但值得注意的是,在未來 Debug 時,要注意 boot 中是否有使用到相關全域範圍!
