From 23431d0e9da3b43759956cbc33763534a4fd8ef1 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Wed, 12 Oct 2022 17:00:11 +0200 Subject: [PATCH] FilterProcessor: Inject column expressions directly into filters fixes #75 --- src/Compat/FilterProcessor.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Compat/FilterProcessor.php b/src/Compat/FilterProcessor.php index 0b091f1..2acc8f7 100644 --- a/src/Compat/FilterProcessor.php +++ b/src/Compat/FilterProcessor.php @@ -9,6 +9,7 @@ use ipl\Orm\Relation; use ipl\Orm\UnionQuery; use ipl\Sql\Expression; +use ipl\Sql\ExpressionInterface; use ipl\Sql\Filter\Exists; use ipl\Sql\Filter\NotExists; use ipl\Stdlib\Contract\Filterable; @@ -128,6 +129,20 @@ protected function requireAndResolveFilterColumns(Filter\Rule $filter, Query $qu throw new InvalidColumnException($columnName, $subject); } + $columns = $subject->getColumns(); + if (isset($columns[$columnName]) && $columns[$columnName] instanceof ExpressionInterface) { + $expression = clone $columns[$columnName]; + $expression->setColumns($resolver->qualifyColumns( + $resolver->requireAndResolveColumns( + $columns[$columnName]->getColumns(), + $subject + ), + $subject + )); + + $filter->setColumn($query->getDb()->getQueryBuilder()->buildExpression($expression)); + } + if ($relationPath !== $baseTable) { $query->utilize($relationPath); $this->madeJoins[$relationPath][] = $filter;