Создайте объект SQL Select в Laminas, который содержит подзапрос в виде таблицы FROM

Я пытаюсь поставить этот запрос:

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 отсутствует, а также «не нужна.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
130
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я исправил проблему, отредактировав класс \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 должен иметь либо псевдоним для подвыборки, либо отключить автоматическую префиксацию столбцов таблицы.

Другие вопросы по теме