mirror of
https://github.com/yiisoft/yii2.git
synced 2026-03-09 08:47:34 +01:00
Fixes #9790: Fixed yii\db\sqlite\QueryBuilder to generate proper SQL for UNION
This commit is contained in:
@@ -356,4 +356,56 @@ class QueryBuilder extends \yii\db\QueryBuilder
|
||||
|
||||
return '(' . implode($operator === 'IN' ? ' OR ' : ' AND ', $vss) . ')';
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function build($query, $params = [])
|
||||
{
|
||||
$query = $query->prepare($this);
|
||||
|
||||
$params = empty($params) ? $query->params : array_merge($params, $query->params);
|
||||
|
||||
$clauses = [
|
||||
$this->buildSelect($query->select, $params, $query->distinct, $query->selectOption),
|
||||
$this->buildFrom($query->from, $params),
|
||||
$this->buildJoin($query->join, $params),
|
||||
$this->buildWhere($query->where, $params),
|
||||
$this->buildGroupBy($query->groupBy),
|
||||
$this->buildHaving($query->having, $params),
|
||||
];
|
||||
|
||||
$sql = implode($this->separator, array_filter($clauses));
|
||||
$sql = $this->buildOrderByAndLimit($sql, $query->orderBy, $query->limit, $query->offset);
|
||||
|
||||
$union = $this->buildUnion($query->union, $params);
|
||||
if ($union !== '') {
|
||||
$sql = "$sql{$this->separator}$union";
|
||||
}
|
||||
|
||||
return [$sql, $params];
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function buildUnion($unions, &$params)
|
||||
{
|
||||
if (empty($unions)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$result = '';
|
||||
|
||||
foreach ($unions as $i => $union) {
|
||||
$query = $union['query'];
|
||||
if ($query instanceof Query) {
|
||||
list($unions[$i]['query'], $params) = $this->build($query, $params);
|
||||
}
|
||||
|
||||
$result .= ' UNION ' . ($union['all'] ? 'ALL ' : '') . ' ' . $unions[$i]['query'];
|
||||
}
|
||||
|
||||
return trim($result);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user