Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Usando regex ou strings simples na query

Estou estudando e tentando novas coisas. Estava vendo os Op.regexp, Op.like e Op.substring . Estava tentando executar esses operador para que buscar a query em qualquer lugar do titulo por exemplo. Porem não estou conseguindo. E o retorno que esta me dando do typeof da prop que eu criei é symbol(regexp), Symbol(substring)

class BookController {
   static async getAllBooksQuery (req, res) {
       const { title, description } = req.query
       const whereParams = {}

       if (title || description ) {
           whereParams.title = {}
           whereParams.description = {}
       }
      
       title ? whereParams.title[Op.like] = title : null
       description ? whereParams.description[Op.like] = description : null
      \\ console.log(typeof whereParams.title) \\object
       \\console.log(whereParams) \\{ title: { [Symbol(like)]: 'lol' }, description: {} }
       try {
           const listAllBooks = await database.Book.findAll({where: {...whereParams}})
           return res.status(200).json(listAllBooks)
       } catch (err) {
           res.status(500).json({message: "Erro interno do servidor"})
       }
   }
3 respostas

Olá, Leonardo.

Tudo bem?

Tente focar no uso do operador Op.like, que é o mais comum para buscas com padrões. Vou ajustar seu código, e tentar garantir que ele funcione conforme esperado:

const { Op } = require('sequelize'); // Certifique-se de importar Op do Sequelize

class BookController {
    static async getAllBooksQuery (req, res) {
        const { title, description } = req.query;
        const whereParams = {};

        if (title) {
            whereParams.title = { [Op.like]: `%${title}%` }; // Adiciona % para buscar em qualquer parte do texto
        }

        if (description) {
            whereParams.description = { [Op.like]: `%${description}%` }; // Adiciona % para buscar em qualquer parte do texto
        }

        try {
            const listAllBooks = await database.Book.findAll({ where: whereParams });
            return res.status(200).json(listAllBooks);
        } catch (err) {
            return res.status(500).json({ message: "Erro interno do servidor" });
        }
    }
}

Alguns pontos importantes:

  1. Importação do Op: Certifique-se de importar o Op do Sequelize.
  2. Uso do operador Op.like: Para buscar em qualquer parte do texto, use % antes e depois do termo de busca (%${title}%).
  3. Verificação de title e description: Adicionei verificações separadas para title e description para garantir que os parâmetros sejam adicionados corretamente ao objeto whereParams.

Com essas alterações, seu código deve ser capaz de buscar títulos e descrições que contenham os termos especificados em qualquer parte do texto.

Faça o teste e veja se faz sentido.

Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos.

Ok, perfeito fez total sentido para mim. Agora outra duvida que surgiu durante os estudos é o uso do operador Op.or. Não consegui pensar em uma forma para construir o objeto where apartir de um objeto vazio, então basicamente eu construi todo o objeto do zero dentro de um if/else. Seria realmente esse a maneira mais usual para o Op.or ? Segue exemplo do meu codigo, onde quero que a busca porcure tanto no titulo quanto na descrição do video. Ainda não fiz a alteração para Op.like mas irei testar o mesmo no meu codigo.

const { Op, sequelize } = require('sequelize')
const database = require('../models')


class VideoController {
    static async getAllVideosQuery(req, res) {
        const { search } = req.query

        let whereParams = {}

        if (search) {
            whereParams = {
                [Op.or]: [
                    {
                        title: {
                            [Op.substring]: search
                        },
                        description: {
                            [Op.substring]: search
                        }
                    }
                ]
            }

        }


        try {
            const listAllVideos = await database.Video.findAll({ where: { ...whereParams } })

            if (listAllVideos.length === 0) {
                return res.status(204).json({ message: 'Nenhum registro encontra ' })
            }

            return res.status(200).json(listAllVideos)
        } catch (err) {
            return res.status(500).json({ message: "Erro interno do servidor" })
        }
    }
solução!

Opa Leonardo.

Para utilizar o operador Op.or de forma eficaz em uma query no Sequelize, é importante entender como estruturar o objeto where para que a busca seja feita em múltiplos campos ao mesmo tempo. Abaixo está um exemplo atualizado e corrigido do seu código para usar o Op.or com Op.like, que geralmente é mais comum para buscas parciais em strings.

Aqui está como você pode fazer isso:

const { Op } = require('sequelize');
const database = require('../models');

class VideoController {
    static async getAllVideosQuery(req, res) {
        const { search } = req.query;

        let whereParams = {};

        if (search) {
            whereParams = {
                [Op.or]: [
                    { title: { [Op.like]: `%${search}%` } },
                    { description: { [Op.like]: `%${search}%` } }
                ]
            };
        }

        try {
            const listAllVideos = await database.Video.findAll({ where: whereParams });

            if (listAllVideos.length === 0) {
                return res.status(204).json({ message: 'Nenhum registro encontrado' });
            }

            return res.status(200).json(listAllVideos);
        } catch (err) {
            return res.status(500).json({ message: "Erro interno do servidor" });
        }
    }
}

Pontos Importantes:

  1. Importação do Op: Certifique-se de importar o Op do Sequelize para usar os operadores.
  2. Uso do Op.like: Utilizei %${search}% para buscar o termo em qualquer parte dos campos title e description.
  3. Estrutura do whereParams: Usei Op.or para combinar as condições para title e description, garantindo que a busca seja feita em ambos os campos.

Explicação:

  • Op.or: Combina múltiplas condições, permitindo que qualquer uma das condições dentro do array seja verdadeira.
  • Op.like: Permite buscas parciais em strings, usando % como curinga para representar zero ou mais caracteres.

Com essas alterações, o código deve ser capaz de buscar termos em ambos os campos title e description de forma eficaz. Isso torna a busca mais flexível e abrangente, melhorando a experiência do usuário ao procurar vídeos etc.