Я пытаюсь поставить этот запрос:
SELECT
*
FROM (
(SELECT * FROM table1)
UNION
(SELECT * FROM table2)
) AS t;
в объект \Laminas\Db\Sql\Select. Что-то вроде этого:
$select1 = new \Laminas\Db\Sql\Select($table1); // this is select for table1
$select2 = new \Laminas\Db\Sql\Select($table2); // this is select for table2
$select1->combine($select2);
Пока все выглядит хорошо, и запрос в порядке, но пока я пытаюсь использовать этот запрос в виде таблицы, например:
$selectUnion = new \Laminas\Db\Sql\Select();
$selectUnion->from($select1->getSqlString());
Я получаю очень странный и неправильный запрос, результат
echo $selectUnion->getSqlString();
является:
SELECT "((SELECT * FROM table1) UNION (SELECT * FROM table2))";
что неверно, потому что часть FROM отсутствует, а также «не нужна.






Я исправил проблему, отредактировав класс \Laminas\Db\Sql\Select из строки 199:
if (! is_string($table) && ! is_array($table) && ! $table instanceof TableIdentifier) {
throw new Exception\InvalidArgumentException(
'$table must be a string, array, or an instance of TableIdentifier'
);
}
путем добавления возможности к объекту $from может иметь тип Select, который изначально поддерживается Laminas:
if (! is_string($table) && ! is_array($table) && ! ($table instanceof TableIdentifier || $table instanceof Select)) {
throw new Exception\InvalidArgumentException(
'$table must be a string, array, or an instance of TableIdentifier or Select'
);
}
Теперь, чтобы построить SELECT из другого SELECT, у нас есть две возможности:
$selectUnion = new \Laminas\Db\Sql\Select();
$selectUnion->from(['t' => $select1->getSqlString()]);
или
$selectUnion = new \Laminas\Db\Sql\Select();
$selectUnion->columns(['*'], false);
$selectUnion->from($select1->getSqlString());
Потому что наш Select должен иметь либо псевдоним для подвыборки, либо отключить автоматическую префиксацию столбцов таблицы.