ORACLE JOIN (построитель запросов)

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Аватара пользователя
MOTORIST
Сообщения: 245
Зарегистрирован: 2010.06.24, 10:04

ORACLE JOIN (построитель запросов)

Сообщение MOTORIST »

Всем привет!
Столкнулся с такой проблемой. Есть проект, который дружит с MySql. Встала задача сменить базу на ORACLE.
Для выгрузки данных использовали построитель запросов:

Код: Выделить всё

$data = (new Query())
            ->select([
                't1.EMP_ID',
                't1.HK_SECTION_CODE',
                't1.EMP_NAME',
                't2.TASK_SEQ_NO'
            ])
            ->from(['t1'=>'RESORT_HK_EMPLOYEES'])
            ->leftJoin(['t2'=>'RESORT_HK_DAILY_TASK_EMP'],'t2.EMP_ID = t1.EMP_ID')
            ->where(['t1.EMP_ID'=>49,'t1.AVAILABLE'=>'Y'])
            ->all();
 
В итоге ловим ошибку General error: 904 OCIStmtExecute: ORA-00904: "T1"."EMP_ID": invalid identifier
Если join переписать на:

Код: Выделить всё

->leftJoin(['t2'=>'RESORT_HK_DAILY_TASK_EMP'],'"t2"."EMP_ID" = "t1"."EMP_ID"')
 
, то все нормально.

Это так и должно быть или я чего то не знаю? Я думал достаточно подключение к базе перебить в конфиге и готово.

Еще интересный момент. Если выгружать одну запись через ->one(), то выгрузка идет адово долго. Если через ->limit(1)->all(), то быстро.
В сознании новичка много возможностей, в сознании эксперта — лишь несколько.
Аватара пользователя
MOTORIST
Сообщения: 245
Зарегистрирован: 2010.06.24, 10:04

Re: ORACLE JOIN (построитель запросов)

Сообщение MOTORIST »

Такой же вопрос и ответ от qiangxue https://github.com/yiisoft/yii2/issues/6182
Тогда зачем мне этот построитель и почему во всех примерах без кавычек?
В сознании новичка много возможностей, в сознании эксперта — лишь несколько.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ORACLE JOIN (построитель запросов)

Сообщение samdark »

Про кавычки уже сказано. В условии строкой мы их нормально распарсить не можем. Для этого пришлось бы писать полноценный разбор SQL по каждую из поддерживаемых СУБД. Не потянем.

->one() не добавляет limit(1). Это нужно делать самостоятельно: https://github.com/yiisoft/yii2/issues/ ... t-49419664
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ORACLE JOIN (построитель запросов)

Сообщение samdark »

Примеры можно поправить. О каких именно речь?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ORACLE JOIN (построитель запросов)

Сообщение samdark »

Примеры можно поправить. О каких именно речь?
Аватара пользователя
MOTORIST
Сообщения: 245
Зарегистрирован: 2010.06.24, 10:04

Re: ORACLE JOIN (построитель запросов)

Сообщение MOTORIST »

В примерах везде используются имена таблиц $query->leftJoin('post', 'post.user_id = user.id');. Не обратил на это внимание. Но грабли большие. Было бы не плохо в примечаниях написать, что псевдонимы в разных базах по разному обрабатываются (где то с кавычками, где то без). Не все знают такие тонкости.
Я так понимаю что бы таких проблем не было нужно использовать имена таблиц и забыть про псевдонимы?
В сознании новичка много возможностей, в сознании эксперта — лишь несколько.
Аватара пользователя
MOTORIST
Сообщения: 245
Зарегистрирован: 2010.06.24, 10:04

Re: ORACLE JOIN (построитель запросов)

Сообщение MOTORIST »

В Laravel 5.2 работает и в MySQL и Oracle.
$data = DB::table(DB::raw('RESORT_HK_EMPLOYEES t1'))
->leftJoin(DB::raw('RESORT_HK_DAILY_TASK_EMP t2'), 't2.EMP_ID', '=', 't1.EMP_ID')
->get();
В сознании новичка много возможностей, в сознании эксперта — лишь несколько.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ORACLE JOIN (построитель запросов)

Сообщение samdark »

condition для JOIN у вас указывается в виде строки. Парсить SQL мы не будем. Можно попробовать указывать в виде другого Query или в виде массива.
Аватара пользователя
MOTORIST
Сообщения: 245
Зарегистрирован: 2010.06.24, 10:04

Re: ORACLE JOIN (построитель запросов)

Сообщение MOTORIST »

Я не против массива, только как? Можно пример.
В сознании новичка много возможностей, в сознании эксперта — лишь несколько.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ORACLE JOIN (построитель запросов)

Сообщение samdark »

Хотя не, не поможет. У нас не значения.
Ответить