Не могу преобразовать мой запрос с Op.Like в Op.Contains, не нарушив код Sequelize.

avatar
Gabriel Reis
1 июля 2021 в 19:57
181
1
0

У меня есть следующий запрос, который работает без проблем:

return await this.model.findAndCountAll({
        where: { 
            [`${field}`]: { [Op.like]: `%${params[field]}%` } ,
            mentor: `1`,
            [Op.or]: [
                {
                    city: { [Op.like]: `%${params[localizationField]}%` } ,
                },
                {
                    state: { [Op.like]: `%${params[localizationField]}%` } ,
                }
            ]  
        },
        include: [
            {
                model: MentorCategory,
                include: [
                    {
                        model: Category,
                        where: {
                            name: { [Op.like]: `%${params[categoryField]}%` },
                        },
                    },
                ],
            },  
        ], 
        order: [
            [order, sort]
        ],
        offset: paginate.offset,
        limit: paginate.perPage
    })

Но если я попытаюсь изменить [Op.like] на [Op.contains] (мне нужно сделать запрос при передаче более одного значения в params[categoryField], например [ 'Em', 'pr' ]) я получаю следующую ошибку:

"Список ошибок: ошибка в синтаксисе SQL; проверьте руководство который соответствует версии вашего сервера MySQL для правильного синтаксиса для используйте рядом с '@> '%Em,pr%' ) ON person.id = mentorCategories.person_id ГДЕ (person' в строке 1"

Источник

Ответы (1)

avatar
Emma
1 июля 2021 в 23:32
0

Op.contains — оператор только для Postgres.

ссылка: https://sequelize.org/master/manual/model-querying-basics.html#postgres-only-range-operators

Однако я вижу в сообщении об ошибке, что вы используете MySQL. Для MySQL вместо этого можно использовать Op.regexp.

where: {
    name: { [Op.regexp]: `${params[categoryField].join('|'}` }
}

Это создаст такой запрос.

... `name` REGEXP 'Em|pr' ...

Это будет соответствовать имени, где оно содержит "Em" или "pr".

Gabriel Reis
1 июля 2021 в 23:57
0

Спасибо Эмме. Вы решили проблему.

Emma
2 июля 2021 в 16:24
0

Не могли бы вы принять мой ответ, если это решено? Спасибо