如何有条件地省略postgresql objection.js中的leftJoin操作?

时间:2019-05-09 18:33:00

标签: sql postgresql knex.js objection.js

我遇到一种情况,我需要使用一些查询,但是省略一些leftJoin-s 在特殊条件下。我想写尽可能多的DRY,所以我没有分开。

const getResultAccounts = async (clientId, params, forTotal = false, manageAllAccounts = false) => {

    // if (manageAllAccounts) {
    //     const manageAllAccountsQuery = IpArea
    //     .query()
    //     .from(function () {
    //         this.select('domain')
    //             .from('ncui-target-accounts')
    //             .where({client_id: clientId})
    //             .union(function () {
    //                 this.select('domain')
    //                   .from('ncui-target-accounts-override')
    //                   .where({client_id: clientId, deleted: false});
    //             })
    //             .as('ta');
    //     }).leftJoin(function () {
    //         this.select('sd.domain', IpArea.raw('array_agg(s.id) as ids'), IpArea.raw('array_agg(s.name) as names'))
    //             .from('segments as s')
    //             .innerJoin('segments-domains as sd', 'sd.segment_id', 's.id')
    //             .where({client_id: clientId})
    //             .groupBy('sd.domain')
    //             .as('s');
    //     }, 's.domain', 'ta.domain');

    //     const allAccounts = await manageAllAccountsQuery;
    //     allAccounts.forEach(concatSegments);
    // }

    const accountsQuery = IpArea
        .query()
        .from(function () {
            this.select('domain')
                .from('ncui-target-accounts')
                .where({client_id: clientId})
                .union(function () {
                    this.select('domain')
                      .from('ncui-target-accounts-override')
                      .where({client_id: clientId, deleted: false});
                })
                .as('ta');
        })
        .leftJoin('ip-areas as ia', 'ia.area_name', 'ta.domain')
        .leftJoin('ip-areas-linkedin-companies-sql-result_v3 as lcl', 'lcl.ip_area_id', 'ia.id')
        .leftJoin('linkedin-companies as lc', 'lcl.linkedin_id', 'lc.linkedin_id')
        .leftJoin('ip-areas-preloaded-stat as ips', function () {
            this.on('ips.ip_area_id', '=', 'ia.id').andOn('ips.client_id', '=', clientId);
        })
        .leftJoin(function () {
            this.select('sd.domain', IpArea.raw('array_agg(s.id) as ids'), IpArea.raw('array_agg(s.name) as names'))
                .from('segments as s')
                .innerJoin('segments-domains as sd', 'sd.segment_id', 's.id')
                .where({client_id: clientId})
                .groupBy('sd.domain')
                .as('s');
        }, 's.domain', 'ta.domain');
}

注释的代码不是DRY,而是我要实现的工作版本。我想有条件地省略leftJoins的这一部分

.leftJoin('ip-areas as ia', 'ia.area_name', 'ta.domain')
.leftJoin('ip-areas-linkedin-companies-sql-result_v3 as lcl', 'lcl.ip_area_id', 'ia.id')
 .leftJoin('linkedin-companies as lc', 'lcl.linkedin_id', 'lc.linkedin_id')
 .leftJoin('ip-areas-preloaded-stat as ips', function () {
            this.on('ips.ip_area_id', '=', 'ia.id').andOn('ips.client_id', '=', clientId);
})

我已经尝试使用then并在promise中检查我的状况,然后返回查询或执行leftJoins,但是这种情况没有用。抛出错误

  

查询leftJoin不是函数

对于这种情况,您有何建议?

0 个答案:

没有答案