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 */
private $filter;
/** @var array */
private $columnMap;
/**
* FilterRenderer constructor.
* @param Filter $filter
@ -42,11 +45,38 @@ class FilterRenderer
public static function applyToQuery(Filter $filter, DbSelect $query)
{
if (! $filter->isEmpty()) {
$renderer = new static($filter, $query->getAdapter());
$renderer->extractColumnMap($query);
$query->where($renderer->toDbExpression());
}
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
*/
@ -93,7 +123,7 @@ class FilterRenderer
protected function renderFilterExpression(FilterExpression $filter)
{
$col = $filter->getColumn();
$col = $this->lookupColumnAlias($filter->getColumn());
$sign = $filter->getSign();
$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()
{
return $this->searchColumns;