self::EMAIL, $productType === 'ssl' => self::SSL, ! in_array($productType, self::UNTYPED_PRODUCT_TYPES, true) => null, str_starts_with($name, 'ssl') => self::SSL, str_contains($name, 'colo') || str_contains($name, 'chỗ đặt') => self::COLO, $productType === 'server_rental' || str_contains($name, 'dedicated') => self::DEDICATED, default => null, }; } public static function constrain(Builder $products, string $group): Builder { $untyped = fn (Builder $query) => $query->whereIn('product_type', self::UNTYPED_PRODUCT_TYPES); $notSsl = fn (Builder $query) => $query->whereRaw("TRIM(name) NOT LIKE 'ssl%'"); $notColo = fn (Builder $query) => $query->where('name', 'not like', '%colo%')->where('name', 'not like', '%chỗ đặt%'); return match ($group) { self::EMAIL => $products->where('product_type', 'email'), self::SSL => $products->where(fn (Builder $query) => $query ->where('product_type', 'ssl') ->orWhere(fn (Builder $other) => $untyped($other)->whereRaw("TRIM(name) LIKE 'ssl%'"))), self::COLO => $untyped($products)->tap($notSsl)->where(fn (Builder $query) => $query ->where('name', 'like', '%colo%') ->orWhere('name', 'like', '%chỗ đặt%')), self::DEDICATED => $untyped($products)->tap($notSsl)->tap($notColo)->where(fn (Builder $query) => $query ->where('product_type', 'server_rental') ->orWhere('name', 'like', '%dedicated%')), default => $products->whereRaw('1 = 0'), }; } }