最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - SELECT WITH CAST OR CONVERT IN iLike USING SEQUELIZE - Stack Overflow

programmeradmin0浏览0评论

I need to do a full-text search with Sequelize, but when i have to use an iLike with a INTEGER or a DATE column i can't send a String in the where clause, how can i do the cast off an column?

Example with a Postgresql query what I want to do:

SELECT  "Proposta".id,  "Proposta".id_segurado, "Proposta".data_implantacao, "Proposta".data_assinatura, "Proposta".status, "Proposta".numero_proposta,
            "Segurado".documento, "Segurado".nome,
            p1.id, p1.nome, p1.codigo, p1.documento, p2.id,
            p2.nome, p2.codigo, p2.documento
FROM "Proposta"
LEFT JOIN "Segurado" ON "Proposta".id_segurado = "Segurado".id
LEFT JOIN "Produtor" p1 ON p1.id = "Proposta".id_produtor1
LEFT JOIN "Produtor" p2 ON p2.id = "Proposta".id_produtor2
WHERE ((p1.codigo = '8002866' OR p2.codigo = '8002866') 
AND ("Proposta".status ILIKE '%108297494%' OR "Proposta".numero_proposta ILIKE '%108297494%'
     OR CAST("Proposta".data_implantacao AS VARCHAR) ILIKE '%108297494%'
     OR CAST("Proposta".data_assinatura AS VARCHAR) ILIKE '%108297494%'))

And this what i tried to do with Sequelize:

const propostas = await Proposta.findAll({
            where: {
                [Op.or]: [
                    { "$produtor1.codigo$": documento_produtor },
                    { "$produtor2.codigo$": documento_produtor },
                ],
                [Op.or]: [
                    {
                        status: {
                            [Op.iLike]: `%${search}%`,
                        },
                    },
                    {
                        numero_proposta: {
                            [Op.iLike]: `%${search}%`,
                        },
                    },
                    db.Sequelize.where(
                        db.Sequelize.cast(
                            db.Sequelize.col("$produtor1.codigo$", "VARCHAR"),
                            { [Op.iLike]: `%${search}%` }
                        )
                    ),
                    db.Sequelize.where(
                        db.Sequelize.cast(
                            db.Sequelize.col("$produtor2.codigo$", "VARCHAR"),
                            { [Op.iLike]: `%${search}%` }
                        )
                    ),
                ],
            },
            include: [
                {
                    model: Segurado,
                    as: "segurado",
                },
                {
                    model: Produtor,
                    as: "produtor1",
                },
                {
                    model: Produtor,
                    as: "produtor2",
                },
            ]
        })

I need to do a full-text search with Sequelize, but when i have to use an iLike with a INTEGER or a DATE column i can't send a String in the where clause, how can i do the cast off an column?

Example with a Postgresql query what I want to do:

SELECT  "Proposta".id,  "Proposta".id_segurado, "Proposta".data_implantacao, "Proposta".data_assinatura, "Proposta".status, "Proposta".numero_proposta,
            "Segurado".documento, "Segurado".nome,
            p1.id, p1.nome, p1.codigo, p1.documento, p2.id,
            p2.nome, p2.codigo, p2.documento
FROM "Proposta"
LEFT JOIN "Segurado" ON "Proposta".id_segurado = "Segurado".id
LEFT JOIN "Produtor" p1 ON p1.id = "Proposta".id_produtor1
LEFT JOIN "Produtor" p2 ON p2.id = "Proposta".id_produtor2
WHERE ((p1.codigo = '8002866' OR p2.codigo = '8002866') 
AND ("Proposta".status ILIKE '%108297494%' OR "Proposta".numero_proposta ILIKE '%108297494%'
     OR CAST("Proposta".data_implantacao AS VARCHAR) ILIKE '%108297494%'
     OR CAST("Proposta".data_assinatura AS VARCHAR) ILIKE '%108297494%'))

And this what i tried to do with Sequelize:

const propostas = await Proposta.findAll({
            where: {
                [Op.or]: [
                    { "$produtor1.codigo$": documento_produtor },
                    { "$produtor2.codigo$": documento_produtor },
                ],
                [Op.or]: [
                    {
                        status: {
                            [Op.iLike]: `%${search}%`,
                        },
                    },
                    {
                        numero_proposta: {
                            [Op.iLike]: `%${search}%`,
                        },
                    },
                    db.Sequelize.where(
                        db.Sequelize.cast(
                            db.Sequelize.col("$produtor1.codigo$", "VARCHAR"),
                            { [Op.iLike]: `%${search}%` }
                        )
                    ),
                    db.Sequelize.where(
                        db.Sequelize.cast(
                            db.Sequelize.col("$produtor2.codigo$", "VARCHAR"),
                            { [Op.iLike]: `%${search}%` }
                        )
                    ),
                ],
            },
            include: [
                {
                    model: Segurado,
                    as: "segurado",
                },
                {
                    model: Produtor,
                    as: "produtor1",
                },
                {
                    model: Produtor,
                    as: "produtor2",
                },
            ]
        })
Share Improve this question edited May 25, 2020 at 19:48 Zilmar asked May 25, 2020 at 19:21 ZilmarZilmar 951 silver badge6 bronze badges 1
  • Please don't shout - use normal casing for the title – Bergi Commented May 25, 2020 at 21:44
Add a ment  | 

1 Answer 1

Reset to default 5

Some notes:

1- Cast function dont works with node reference, so the $produtor1.codigo$ wouldn't work, you have to use the postgres reference, in that case would be produtor1.codigo

2- You have to call the function by the sequelize that is defined in the models/index.js

So:

call the sequelize like that:

const {sequelize} = require("{path}/models/index.js")

And call the cast function like that:

sequelize.where(
    sequelize.cast(sequelize.col("produtor1.codigo"),"varchar"),
    { [Op.iLike]: `%${search}%` }
)
发布评论

评论列表(0)

  1. 暂无评论