Zend pdo_oci и pdo_mysql генерируют разные форматы запросов

Адаптер БД Oracle: "pdo_oci" Адаптер БД MySQL: «pdo_mysql»

Код, используемый для построения запроса JOIN:

            $db = Zend_Db_Table::getDefaultAdapter();
            $db->setFetchMode(Zend_Db::FETCH_OBJ);

            $select = $db->select()->from(array(
                   't1' => $this->_Table1
            ));
            $select = $select->join(array(
                   't2' => $this->_Table2
           ), 't1.MENU_ID = t2.SUBMENU_ID',
            array(
                    'MENU_ID',
                    'SET_REDIRECT_URL',
                    'SUBMENU_TYPE'
            ));
            $select = $select->order(array(
                    'MENU_ID',
                    't2.DISPLAY_ORDER'
            ));
            $select = $select->where('t1.IS_ACTIVE = ?', 'Y');
            $result = $db->fetchAll($select);

Запрос, созданный адаптером Oracle (pdo_oci):

SELECT "t1".*, "t2"."MENU_ID" AS "parent_id", "t2"."SET_REDIRECT_URL", "t2"."SUBMENU_TYPE" FROM "DRP_ADMIN_MENU_MASTER" "t1"  INNER JOIN "DRP_ADMIN_MENU_MAPPER" "t2" ON t1.MENU_ID = t2.SUBMENU_ID WHERE (t1.IS_ACTIVE = 'Y') ORDER BY "parent_id" ASC, "t2"."DISPLAY_ORDER" ASC

Запрос, сгенерированный адаптером Mysql (pdo_mysql):

SELECT `t1`.*, `t2`.`MENU_ID` AS `parent_id`, `t2`.`SET_REDIRECT_URL`, `t2`.`SUBMENU_TYPE` FROM `DRP_ADMIN_MENU_MASTER` AS `t1`  INNER JOIN `DRP_ADMIN_MENU_MAPPER` AS `t2` ON t1.MENU_ID = t2.SUBMENU_ID WHERE (t1.IS_ACTIVE = 'Y') ORDER BY `parent_id` ASC, `t2`.`DISPLAY_ORDER` ASC

Проблема: Oracle DB не может идентифицировать t1 и t2 в [t1.MENU_ID = t2.SUBMENU_ID], если они не заключены в двойные кавычки. И если я ставлю двойные кавычки вручную, то mysql выдает ошибку.

Ошибка в оракуле:

General error: 904 OCIStmtExecute: ORA-00904: "T2"."SUBMENU_ID": invalid identifier

Прошло некоторое время с тех пор, как я использовал ZFW, но вы пытались использовать «T2» вместо «t2» в коде? Или таблицы были созданы с чувствительными к регистру именами в нижнем регистре?

Christopher Jones 07.03.2019 01:13
Стоит ли изучать 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 и хотите разрабатывать...
1
1
50
1

Ответы 1

Решил это. Используется $db->quoteIdentifier(). и это сработало

        $db = Zend_Db_Table::getDefaultAdapter();
        $db->setFetchMode(Zend_Db::FETCH_OBJ);

        $select = $db->select()->from(array(
               't1' => $this->_Table1
        ));
        $select = $select->join(array(
               't2' => $this->_Table2
       ), $db->quoteIdentifier('t1.MENU_ID') . ' = ' . $db->quoteIdentifier('t2.SUBMENU_ID'),
        array(
                'MENU_ID',
                'SET_REDIRECT_URL',
                'SUBMENU_TYPE'
        ));
        $select = $select->order(array(
                'MENU_ID',
                't2.DISPLAY_ORDER'
        ));
        $select = $select->where($db->quoteIdentifier('t1.IS_ACTIVE') . ' = ?', 'Y');
        $result = $db->fetchAll($select);

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