. */ namespace SP\Mvc\Model; use RuntimeException; /** * Class QueryCondition * * @package SP\Mvc\Model */ final class QueryCondition { const CONDITION_AND = ' AND '; const CONDITION_OR = ' OR '; /** * @var array */ protected $query = []; /** * @var array */ protected $param = []; /** * @param string $query * @param array|null $params * * @return QueryCondition */ public function addFilter(string $query, ?array $params = null): QueryCondition { $this->query[] = "($query)"; if ($params !== null) { $this->param = array_merge($this->param, $params); } return $this; } /** * @param string $type * * @return string|null */ public function getFilters(string $type = self::CONDITION_AND): ?string { if ($type !== self::CONDITION_AND && $type !== self::CONDITION_OR) { throw new RuntimeException(__u('Invalid filter type')); } return $this->hasFilters() ? '(' . implode($type, $this->query) . ')' : null; } /** * @return bool */ public function hasFilters(): bool { return !empty($this->query); } /** * @return array */ public function getParams(): array { return $this->param; } /** * @return int */ public function getFiltersCount(): int { return count($this->query); } }