Sequelize — используйте функции sequelize для преобразования запросов iLike в дружественные к MySQL

#mysql #node.js #sequelize.js

#mysql #node.js #sequelize.js

Вопрос:

Я обычно использую PostgreSQL, и это мой первый раз, когда я использую MySQL с Sequelize. Я узнал, что MySQL не поддерживает iLike , и я пытаюсь преобразовать my iLike в MySQL дружественный (так сказать).

Мне удалось успешно выполнить приведенное ниже с помощью одного из моих запросов.

 where: {
  [Op.or]: [
    {
      name: {
       [Op.iLike]: `%${searchTerm || ''}`,
      },
    },
    {
      description: {
        [Op.iLike]: `%${searchTerm || ''}`,
      },
    },
  ],
},

**Converted To**

where: {
  [Op.or]: [
    Sequelize.where(Sequelize.fn('lower', Sequelize.col('name')), {
      [Op.like]: `%${searchTerm || ''}`,
    }),
    Sequelize.where(Sequelize.fn('lower', Sequelize.col('description')), {
      [Op.like]: `%${searchTerm || ''}`,
    }),
  ],
},
 

С чем я борюсь, так это с преобразованием следующего. Я был бы признателен за любой вклад, который я мог бы получить.

 ingredients = ['%salt%', '%pepper%'];

where: {
  ingredient: {
    [Op.iLike]: {
      [Op.any]: ingredients,
    },
  },
},
SQL - WHERE "Ingredient"."ingredient" ILIKE ANY (ARRAY['%salt%','%pepper%']);

**Attempt to Convert**

where: Sequelize.where(
  Sequelize.fn('lower', Sequelize.col('ingredient')),
  {
    [Op.like]: {
      [Op.any]: ingredients,
    },
  }
),
SQL - WHERE lower(`ingredient`) LIKE ANY ('%salt%', '%pepper%')  It seems like ingredients is not passed as an array compared to the above code.
 

Комментарии:

1. // In Postgres, Op.like/Op.iLike/Op.notLike can be combined to Op.any: [Op.like]: { [Op.any]: ['cat', 'hat'] } // LIKE ANY ARRAY['cat', 'hat'] Означает ли это, что это только для PG?

2. Разве первый пример с OR and iLIke не совпадает со вторым с iLike and any ?

3. Привет, спасибо, что взглянули. Да, это необработанный SQL-запрос, возвращаемый из этого запроса PG. В MySQL iLike не работает.

4. И в первом примере я проверяю, содержат ли столбцы name или description поисковый запрос. Во втором примере; Я проверяю, есть ли какие-либо ingredient условия поиска в массиве. В основном возвращайте мне все ингредиенты, которые содержат ['%salt%', '%pepper%'] . Если я не ошибаюсь [Op.or] , проверяет несколько столбцов ( name или description ), в то время [Op.any] как проверяет только один столбец name , например (верните мне все, чье имя совпадает James , но не будет проверять, содержит ли другой столбец James ).

5. Но вы можете использовать один и тот же столбец OR столько раз, сколько длина массива

Ответ №1:

Этот способ сработал для меня, может быть, этот способ поможет вам.

 where: {
  title: {
    [Op.like]: ['%'   title   '%'],
  },
},