Почему мой условный WHERE внутри оператора OR в запросе Sequelize преобразуется в AND?

Я пытаюсь сделать запрос с Sequelize с условным WHERE, как описано здесь (Как выполнить поиск с условными параметрами where с помощью Sequelize).

Соответствующая часть моего кода выглядит так

    const Op = Sequelize.Op;
    var search = {};
     if (typeof req.query.search !== 'undefined'){
         search.nome = {[Op.like]: '%' + req.query.search + '%'};
         search.username = {[Op.like]: '%' + req.query.search + '%'};
    }
    model.User.findAll({
        where:{
         [Op.or]: [
           search
         ]
      })

Это работает, но сгенерированный SQL добавляет И вместо ИЛИ, например:

    SELECT 'id_', 'nome', 'username', 'id' FROM 'User' AS 'User' WHERE (('User'.'nome' LIKE '%test%' AND 'User'.'username' LIKE '%test%'))

Я делаю что-то не так, чего не вижу? Я уже пробовал несколько комбинаций этого, и ни одна не работает.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
3 786
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Что-то не так в построенном search фильтре. [Op.or] должен быть разбросом поиска, а не массивом.

Попробуйте, как показано ниже,

model.User.findAll({
  where: {
    [Op.or]: {
      email: {
        [Op.like]: 'abcd',
      },
      username: {
        [Op.like]: 'cdf',
      },
    }
  },
  logging: console.info,
});

вы получите ниже,

    SELECT "id", "name", "username" FROM "users" AS "User" WHERE "User"."deleted_at" IS NULL AND ("User"."email" LIKE 'abcd' OR "User"."username" LIKE 'cdf');

Да, я пробовал это раньше, и это работает, но мне это не подходит, потому что я хочу, чтобы предложение WHERE создавалось динамически.

ALG 08.04.2019 15:48

Распределите объект поиска внутри ключа where. Я упомянул об этом в ответе.

anoop 08.04.2019 19:31

Теперь вижу, спасибо. Не обратил внимания на значение скобок. Странно, не пришлось распространять переменную, просто поменял на where: {[Op.or]: search } и заработало.

ALG 08.04.2019 21:49

Да, это сработает, поскольку поиск — это просто динамически создаваемый объект.

anoop 08.04.2019 22:05

попробуй использовать спред

model.User.findAll({
  where: {
    [Op.or]: [
      {...search}
    ]
  }
})

что насчет этого?

const where = {}
     if (typeof req.query.search !== 'undefined'){
       where[Op.or] = {
         nome : {
          [Op.like] : `%${req.query.search}%`
         },
         username : {
          [Op.like] : `%${req.query.search}%`
        },
       }
    }

    model.User.findAll({
      where
    })

Это имеет смысл, но я получаю тот же результат. Если я уберу фигурные скобки, я получу search is not iterable

ALG 08.04.2019 15:51

Это не сработает. Или оператор не принимает массив.

anoop 08.04.2019 22:06

@anoop docs.sequelizejs.com/manual/querying.html#operators, как видите, вы можете использовать массив.

kkangil 09.04.2019 03:13

@kkangil да, ты прав, он принимает. Я думал, что комбинации не поддерживаются в массивах, но похоже, что это так. github.com/sequelize/sequelize/blob/v4/docs/…. Хорошая находка.

anoop 09.04.2019 03:29

@anoop да, я так и сказал. Я использую его много раз. но мне интересно, почему возникает ошибка, приведенная выше код.

kkangil 09.04.2019 03:50

@kkangil Я думаю, что не использую плагины для распространения объектов для транспирации

anoop 09.04.2019 03:51

Отредактированный код работал отлично. Как я прокомментировал другой ответ, единственной проблемой с моим кодом были скобки.

ALG 09.04.2019 16:42

Вот код, который я использую:

return Models.job.findAndCountAll({
  raw: true,
  where: {
    isActive: 1,
    ...((args.statusOfJob > 0) && {
      status: args.statusOfJob
    })
  }
})

В этом случае statusOfJob — это числовое значение, используемое в объекте выбора, где 0 будет отображать все элементы.

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

Другие вопросы по теме