簡體   English   中英

序列化條件包含where子句nodejs

[英]Sequelize conditional inclusion of where clause nodejs

我有這段代碼,其中包含多個where子句:

Time_Sheet_Details.findAll({
    include: [
        {
            model: timesheetNotesSubcon,
            required: false,
            attributes:["note","file_name", "id", "working_hrs", "timestamp", "has_screenshot", "notes_category"]
        },
        {
            model: Timesheet,
            attributes:["id","leads_id","userid"],
            where:  {leads_id: filters.leads_id}, // Client
            include:[
                {
                    model: Lead_Info, attributes:["id","fname","lname","email","hiring_coordinator_id","status"],
                    where:  {hiring_coordinator_id: {$in: filters.sc_id}}, // SC
                    include:[{
                        model: adminInfoSchema,
                        required: false,
                        attributes:["admin_id","admin_fname", "admin_lname", "admin_email", "signature_contact_nos", "signature_company"],      
                    }]

                },
                {
                    model:Personal_Info,attributes:["userid","fname","lname","email"],
                    where: {userid: filters.subcon_id}, // Subcon
                }
            ]
        }],
    where: { 
        reference_date: filters.reference_date
    },
    order:[
        ["id","DESC"]
    ],
    offset:((page-1)*limit),
    limit : limit,
    subQuery:false

}).then(function(foundObject){
    willFulfillDeferred.resolve(foundObject);
});

where子句帶有注釋Client,SC和Subcon。 但是,如果那些where子句是可選的,最好的方法是什么? 我正在使用它作為搜索過濾器。 因此,如果filters.leads_idnullwhere: {leads_id: filters.leads_id}, // Client不應包含在查詢中。 與其他人一樣。 我能想到的唯一解決方案是針對每個不是null參數的場景重復這些代碼塊,但這是重復性的並且不切實際。

還有其他方法或解決方案嗎?

如果我理解正確,我認為第一步是應根據是否設置了每個特定的搜索條件,有條件地定義各自的where子句:

const clientWhere = filters.leads_id ? {leads_id: filters.leads_id} : {}
const scWhere = filters.sc_id ? {hiring_coordinator_id: {$in: filters.sc_id}} : {}
const subconWhere = filters.subcon_id ? {userid: filters.subcon_id} : {}

因此,在這一點上,如果未設置搜索選項,則將只有一個空對象作為where子句。

接下來,在查詢中使用那些預定義的where子句對象:

Time_Sheet_Details.findAll({
    include: [
        {
            model: timesheetNotesSubcon,
            required: false,
            attributes:["note","file_name", "id", "working_hrs", "timestamp", "has_screenshot", "notes_category"]
        },
        {
            model: Timesheet,
            attributes:["id","leads_id","userid"],
            where: clientWhere, // Client
            include:[
                {
                    model: Lead_Info, attributes:["id","fname","lname","email","hiring_coordinator_id","status"],
                    where: scWhere, // SC
                    include:[{
                        model: adminInfoSchema,
                        required: false,
                        attributes:["admin_id","admin_fname", "admin_lname", "admin_email", "signature_contact_nos", "signature_company"],      
                    }]

                },
                {
                    model:Personal_Info,attributes:["userid","fname","lname","email"],
                    where: subconWhere, // Subcon
                }
            ]
        }],
    where: { 
        reference_date: filters.reference_date
    },
    order:[
        ["id","DESC"]
    ],
    offset:((page-1)*limit),
    limit : limit,
    subQuery:false

}).then(function(foundObject){
    willFulfillDeferred.resolve(foundObject);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM