diff --git a/src/Database/Database.php b/src/Database/Database.php index cc30ddb10..3605c77df 100644 --- a/src/Database/Database.php +++ b/src/Database/Database.php @@ -348,6 +348,11 @@ class Database protected bool $filter = true; + /** + * @var array|null + */ + protected ?array $disabledFilters = []; + protected bool $validate = true; protected bool $preserveDates = false; @@ -813,17 +818,35 @@ public function disableFilters(): static * * @template T * @param callable(): T $callback + * @param array|null $filters * @return T */ - public function skipFilters(callable $callback): mixed + public function skipFilters(callable $callback, ?array $filters = null): mixed { - $initial = $this->filter; - $this->disableFilters(); + if (empty($filters)) { + $initial = $this->filter; + $this->disableFilters(); + + try { + return $callback(); + } finally { + $this->filter = $initial; + } + } + + $previous = $this->filter; + $previousDisabled = $this->disabledFilters; + $disabled = []; + foreach ($filters as $name) { + $disabled[$name] = true; + } + $this->disabledFilters = $disabled; try { return $callback(); } finally { - $this->filter = $initial; + $this->filter = $previous; + $this->disabledFilters = $previousDisabled; } } @@ -6625,6 +6648,10 @@ protected function decodeAttribute(string $filter, mixed $value, Document $docum return $value; } + if (!\is_null($this->disabledFilters) && isset($this->disabledFilters[$filter])) { + return $value; + } + if (!array_key_exists($filter, self::$filters) && !array_key_exists($filter, $this->instanceFilters)) { throw new NotFoundException("Filter \"{$filter}\" not found for attribute \"{$attribute}\""); }