我遇到一种情况,我需要使用一些查询,但是省略一些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不是函数
对于这种情况,您有何建议?