FilterRenderer: look up column aliases

...and allow to apply filter objects to ZfQueryBasedTable
This commit is contained in:
Thomas Gelf 2017-07-26 09:24:47 +02:00
parent f2ad5884ea
commit f89fab2a27
2 changed files with 39 additions and 3 deletions

View File

@ -21,6 +21,9 @@ class FilterRenderer
/** @var Filter */ /** @var Filter */
private $filter; private $filter;
/** @var array */
private $columnMap;
/** /**
* FilterRenderer constructor. * FilterRenderer constructor.
* @param Filter $filter * @param Filter $filter
@ -42,11 +45,38 @@ class FilterRenderer
public static function applyToQuery(Filter $filter, DbSelect $query) public static function applyToQuery(Filter $filter, DbSelect $query)
{ {
$renderer = new static($filter, $query->getAdapter()); if (! $filter->isEmpty()) {
$query->where($renderer->toDbExpression()); $renderer = new static($filter, $query->getAdapter());
$renderer->extractColumnMap($query);
$query->where($renderer->toDbExpression());
}
return $query; return $query;
} }
protected function lookupColumnAlias($column)
{
if (array_key_exists($column, $this->columnMap)) {
return $this->columnMap[$column];
} else {
return $column;
}
}
protected function extractColumnMap(DbSelect $query)
{
$map = [];
foreach ($query->getPart(DbSelect::COLUMNS) as $col) {
if ($col[1] instanceof DbExpr) {
$map[$col[2]] = (string) $col[1];
} else {
$map[$col[2]] = $col[0] . '.' . $col[1];
}
}
$this->columnMap = $map;
}
/** /**
* @return string * @return string
*/ */
@ -93,7 +123,7 @@ class FilterRenderer
protected function renderFilterExpression(FilterExpression $filter) protected function renderFilterExpression(FilterExpression $filter)
{ {
$col = $filter->getColumn(); $col = $this->lookupColumnAlias($filter->getColumn());
$sign = $filter->getSign(); $sign = $filter->getSign();
$expression = $filter->getExpression(); $expression = $filter->getExpression();

View File

@ -67,6 +67,12 @@ abstract class ZfQueryBasedTable extends Table
); );
} }
public function applyFilter(Filter $filter)
{
FilterRenderer::applyToQuery($filter, $this->getQuery());
return $this;
}
protected function getSearchColumns() protected function getSearchColumns()
{ {
return $this->searchColumns; return $this->searchColumns;