Как в запросе добавить JSON_TABLE в конец секции FROM в AR?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Как в запросе добавить JSON_TABLE в конец секции FROM в AR?

Сообщение PendalF »

Здравствуйте!
Есть таблица artist в базе с полем data_json, в котором хранится json, я хочу с помощью AR в конец секции FROM добавить следующий код:

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

JSON_TABLE(data_json, '$.songs[*]' COLUMNS (
  name VARCHAR(128) PATH '$.name',
  duration INT PATH '$.duration'
 )
) songs
Пишу вот так:

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

$query->from([
'artist',
'JSON_TABLE(data_json, '$.songs[*]' COLUMNS (
  name VARCHAR(128) PATH '$.name',
  duration INT PATH '$.duration'
 )
) songs'
])
И всё работает, но если добавить в запрос left join, то запрос ломается, т.к. left join добавляется к концу секции FROM и применяется к JSON_TABLE.
Вопрос: как сообщить AR, что нужно добавить JSON_TABLE в конец FROM?
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Как в запросе добавить JSON_TABLE в конец секции FROM в AR?

Сообщение PendalF »

Решил проблему так: переопределил с помощью classesMap классы yii\db\Query и yii\db\QueryBuilder, в которых переписал метод build и добавил свойство beforeWhere, с помощью которого уже и добавил нужный sql-код.
kukuruku
Сообщения: 1318
Зарегистрирован: 2011.02.14, 11:36

Re: Как в запросе добавить JSON_TABLE в конец секции FROM в AR?

Сообщение kukuruku »

можно детальнее про переопределение?
как я понимаю нужно взять полностью код из класса QueryBuilder, сохранить в новый файл, туда дописать свой код, и дальше заменить в classesMap yii\db\QueryBuilder на новый класс?
при это есть шанс что после обновления yii чтото может сломаться?
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Как в запросе добавить JSON_TABLE в конец секции FROM в AR?

Сообщение PendalF »

Да, всё именно так. Вначале я хотел поменять класс через DI, но yii\db\Query наотрез отказался меняться, хотя yii\db\ActiveQuery меняется без проблем, поэтому пришлось менять через classesMap. Тоже переживаю насчёт того, что при обновлении придётся эти файлы обновлять вручную, но другого способа я не нашёл.
Ответить