FilterRenderer: look up column aliases
...and allow to apply filter objects to ZfQueryBasedTable
This commit is contained in:
parent
f2ad5884ea
commit
f89fab2a27
|
@ -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)
|
||||
{
|
||||
$renderer = new static($filter, $query->getAdapter());
|
||||
$query->where($renderer->toDbExpression());
|
||||
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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue