Я выполняю условный запрос к различным столбцам таблицы, который называется «сообщение». По сути, я хочу получить все сообщения, которые были отправлены или получены пользователем, и при желании выполнить поиск в столбце JSON для поиска.
JS выглядит следующим образом:
const messages = await new Message()
.query((qb) => {
qb.where('deleted', null);
if (sent)
qb.andWhere('from_user_id', req.user.attributes.id);
else
qb.andWhere('to_user_id', req.user.attributes.id);
if (searchString)
qb.andWhereRaw(`message_details->'$.title' LIKE "%${searchString}%" OR message_details->'$.body' LIKE "%${searchString}%"`)
})
.fetchPage();
Без строки поиска это работает нормально. Однако со строкой поиска я получаю обратно каждое сообщение, содержащее эту строку, независимо от того, какому пользователю оно было отправлено или.
Необработанный SQL, который создается по запросу без строки поиска выглядит так:
sql: 'select `message`.* from `message` where `deleted` is null and `from_user_id` = 1'
С поисковой строкой это выглядит так:
sql: 'select `message`.* from `message` where `deleted` is null and `from_user_id` = 1 and message_details->\'$.title\' LIKE "%mysearchstring%" OR message_details->\'$.body\' LIKE "%mysearchstring%"
Что здесь происходит? Что еще я должен проверять?