Как на стороне сервера фильтровать каждое поле таблицы в sequelize (nodejs orm) - PullRequest
0 голосов
/ 09 октября 2019

У меня есть некоторые проблемы, чтобы узнать, как я должен выполнить фильтрацию в сиквелизе ORM. Я уже сделал, нумерацию страниц на стороне сервера и сортировку, следуя этому руководству для Angular https://blog.angular -university.io / angular-material-data-table /

Я использую Sequelize 5.8.5, но не в машинописи.

Но, в моем случае, бэкэнд находится в nodejs с использованием Sequelize. И я хочу сделать поиск параметра строки фильтра по каждому полю моей объединенной таблицы. Если "строка" похожа на field1 ИЛИ "строка" похожа на field2 ИЛИ .... и т.д.

Вот мой router.get в дальнейшем.

router.get('', auth.checkToken, function(req, res) {
     let options = {
         include: [{
             model: models.intervention,
             attributes: ['id','start_date','end_date','agent_id','state_id'],
             required: false,
             include: [{
                 model: models.agent,
                 required: false,
             },
             {
                 model: models.state,
                 required: false,
             },
             {
                 model: models.intervention_participation,
                 required: false,
                 include: [{
                     model: models.agent,
                     attributes: ['id','access_token','agent_type_id','firstname','lastname','mail','password'],
                     required: false,
                     include: [{
                         model: models.shift_do,
                         attributes: ['id','shift_id','agent_id','shift_date'],
                         required: false,
                         on: {
                             'agent_id': {
                                 [Op.eq]: Sequelize.col('intervention->agent.id')
                             },
                             'shift_date': {
                                 [Op.eq]: Sequelize.col('intervention.start_date')
                             },
                         },
                         include: [{
                             model: models.shift,
                             required: false,
                         }]
                     }]
                 }]
             },
             {
                 model: models.operating_range_do,
                 required: false,
                 include: [{
                     model: models.operating_range,
                     required: false,
                 }]
             },
             {
                 model: models.equipment_intervention,
                 required: false,
                 include: [{
                     model: models.equipment,
                     required: false,
                     include: [{
                         model: models.equipment_type,
                         required: false,
                         include: [{
                             model: models.work_field,
                             required: false,
                         }]
                 },
                 {
                     model: models.equipment_location,
                     required: false,
                     include: [{
                         model: models.structure,
                         required: false,
                     },
                     {
                         model: models.local,
                         required: false,
                     },
                     {
                         model: models.place,
                         required: false,
                     }]
                 }]
             }]
             },
             {
                 model: models.intervention_helper,
                 required: false,
                 include: [{
                     model: models.external_actor,
                     required: false,
                 }]
             }]
         },
         {
             model: models.work_type,
             required: false
         },
         {
             model: models.di_externe,
             required: false
         }]
     };
     if (req.query.filter) {
         options.where = {
             $or: [
                 { id: { $like: req.query.filter}},
                 { title: { $like: req.query.filter}},
                 { description: { $like: req.query.filter}},
                 { start_date: { $like: req.query.filter}},
             ]
         };
     }
     if (req.query.sort) {
         options.order = [['id', req.query.sort || 'DESC']];
     }
     if (req.query.page && req.query.pageSize) {
         options.offset = req.query.page * req.query.pageSize;
         options.limit = parseInt(req.query.page, 10) + parseInt(req.query.pageSize, 10);
     }
     models.intervention_maincourante
         .findAll(options)
         .then(all => {
             res.send(all);
         });
 });

это эта часть, которая не работает:

if (req.query.filter) {
     options.where = {
         $or: [
             { id: { $like: req.query.filter}},
             { title: { $like: req.query.filter}},
             { description: { $like: req.query.filter}},
             { start_date: { $like: req.query.filter}},
         ]
     };
 }

Я тоже так пробовал, потому что иногда псевдоним для операторов не работал? Но это ничего не изменило.

[Op.or]: [
    { id: { [Op.like]: "%" + req.query.filter + "%"}},
    { title: { [Op.like]: "%" + req.query.filter + "%"}},
    { description: { [Op.like]: "%" + req.query.filter + "%"}},
    { start_date: { [Op.like]: "%" + req.query.filter + "%"}},
  ]

Тогда я попробовал:

options.where = {
  [Op.or]: [{
    title: {
      [Op.like]: "%" + req.query.filter + "%",
    },
    description: {
      [Op.like]: "%" + req.query.filter + "%",
    },
    start_date: {
      [Op.like]: "%" + req.query.filter + "%",
    }
  }]
};

Что в документации:

{
    [Op.or]: [
        {
            title: {
                [Op.like]: 'Boat%'
            }
        },
        {
            description: {
                [Op.like]: '%boat%'
            }
        }
   ]
}

Большое спасибо, если кто-тознаю, как это сделать.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

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

Попробуйте отловить ошибку и зарегистрировать ее, чтобы идентифицировать проблему

models.intervention_maincourante
   .findAll(options)
   .then(all => {
        res.send(all);
   }).catch(err => {
        console.log("err", err);
   });

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

Обновление:

В зависимости от ошибки, пожалуйста, проверьте условие лайка.

Ваше предложение лайка должно быть примерно таким. Также убедитесь, что вы ссылаетесь на правильные имена столбцов.

options.where = {
  [Op.or]: [{
    title: {
      [Op.like]: `%${req.query.filter}%`,
    },
    description: {
      [Op.like]: `%${req.query.filter}%`,
    },
    start_date: {
      [Op.like]: `%${req.query.filter}%`,
    }
  }]
};
0 голосов
/ 09 октября 2019

В Sequelize ORM, когда вы используете оператор $like, вы можете передать строку поиска напрямую или заключить в % OR _. если вы хотите сопоставить некоторую часть строки, вы можете использовать оператор * 1003.

см. Этот документ https://sequelize.org/master/manual/querying.html#operators

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...