В этом методе допущена ошибка, по этому он не работает вплоть до версии joomla 3.3.

Для исправления этого бага надо создать  потомок класса JDatabaseQuery, переопределить в нем методы __toString и union.

Вот собственно код переопределения класса.

 

class JDatabaseQueryUnion extends JDatabaseQuery
{
	 	/**
	 * Magic function to convert the query to a string.
	 *
	 * @return  string	The completed query.
	 *
	 * @since   11.1
	 */
	public function __toString()
	{
		$query = '';
		switch ($this->type)
		{
			case 'element':
				$query .= (string) $this->element;
				break;
			case 'select':
				$query .= (string) $this->select;
				$query .= (string) $this->from;
				if ($this->join)
				{
					// special case for joins
					foreach ($this->join as $join)
					{
						$query .= (string) $join;
					}
				}
				if ($this->where)
				{
					$query .= (string) $this->where;
				}
				if ($this->group)
				{
					$query .= (string) $this->group;
				}
				if ($this->having)
				{
					$query .= (string) $this->having;
				}
				if ($this->order)
				{
					$query .= (string) $this->order;
				}
				break;
			case 'union':
				$query .= (string) $this->union;
				if ($this->order)
				{
					$query .= (string) $this->order;
				}
				
				break;
			case 'delete':
				$query .= (string) $this->delete;
				$query .= (string) $this->from;
				if ($this->join)
				{
					// special case for joins
					foreach ($this->join as $join)
					{
						$query .= (string) $join;
					}
				}
				if ($this->where)
				{
					$query .= (string) $this->where;
				}
				break;
			case 'update':
				$query .= (string) $this->update;
				if ($this->join)
				{
					// special case for joins
					foreach ($this->join as $join)
					{
						$query .= (string) $join;
					}
				}
				$query .= (string) $this->set;
				if ($this->where)
				{
					$query .= (string) $this->where;
				}
				break;
			case 'insert':
				$query .= (string) $this->insert;
				// Set method
				if ($this->set)
				{
					$query .= (string) $this->set;
				}
				// Columns-Values method
				elseif ($this->values)
				{
					if ($this->columns)
					{
						$query .= (string) $this->columns;
					}
					$query .= ' VALUES ';
					$query .= (string) $this->values;
				}
				break;
		}
		return $query;
	}
	 
	 /**
	 * Add a query to UNION with the current query.
	 * Multiple unions each require separate statements and create an array of unions.
	 *
	 * Usage:
	 * $query->union('SELECT name FROM  #__foo')
	 * $query->union('SELECT name FROM  #__foo','distinct')
	 * $query->union(array('SELECT name FROM  #__foo','SELECT name FROM  #__bar'))
	 *
	 * @param   mixed    $query     The JDatabaseQuery object or string to union.
	 * @param   boolean  $distinct  True to only return distinct rows from the union.
	 * @param   string   $glue      The glue by which to join the conditions.
	 *
	 * @return  mixed    The JDatabaseQuery object on success or boolean false on failure.
	 *
	 * @since   12.1
	 */
	public function union($query, $distinct = false, $glue = '')
	{
		$this->type = 'union';
		// Clear any ORDER BY clause in UNION query
		// See http://dev.mysql.com/doc/refman/5.0/en/union.html
		if (!is_null($this->order))
		{
			$this->clear('order');
		}
		// Set up the DISTINCT flag, the name with parentheses, and the glue.
		if ($distinct)
		{
			$name = '()';
			$glue = ')' . PHP_EOL . 'UNION  (';
		}
		else
		{
			$glue = ')' . PHP_EOL . 'UNION ALL(';
			$name = '()';
		}
		// Get the JDatabaseQueryElement if it does not exist
		if (is_null($this->union))
		{
				$this->union = new JDatabaseQueryElement($name, $query, "$glue");
		}
		// Otherwise append the second UNION.
		else
		{
			$glue = '';
			$this->union->append($query);
		}
		return $this;
	}
}

 

Для создания объекта этого класса в коде надо воспользоваться следующей конструкцией.

 

// Create a new query object.
$db = $this->getDbo();
$query = New JDatabaseQueryUnion($db);

 

 

Никаких мыслей по поводу “Исправление метода union класса JDatabaseQuery”