使用knex对3个表执行连接操作

时间:2017-09-28 12:51:12

标签: sql postgresql join knex.js

我有一个SQL查询,它对2个表执行innerJoin操作。

表1:user

enter image description here

表2:local_auth

enter image description here

查询根据user_id

返回所有匹配的行
async getUser(id) {
    return camelizeKeys(
        await knex
        .select(
            'u.id',
            'u.first_name',
            'u.last_name',
            'u.username',
            'u.image_url',
            'u.is_admin',
            'u.phone',
            'u.info',
            'la.email'
        )
        .from('user AS u')
        .leftJoin('local_auth AS la', 'la.user_id', 'u.id')
        .where('u.id', '=', id)
        .first()
    );
}

现在,我要做的是修改上面的查询,以便它对3个表执行连接操作。

表3:customer_user

enter image description here

还有一个名为customer_user的表,其中user_id作为外键之一。如何根据customer_useruser_id表中检索某些字段。我想执行类似这样的操作(当然,由于使用knex执行多个连接的方法不正确,以下操作无效)

async getUser(id) {
    return camelizeKeys(
        await knex
        .select(
            'u.id',
            'u.first_name',
            'u.last_name',
            'u.username',
            'u.image_url',
            'u.is_admin',
            'u.phone',
            'u.info',
            'la.email',
            'cu.customer_id',
            'cu.department_id'
        )
        .from('user AS u')
        .leftJoin('local_auth AS la', 'la.user_id', 'u.id')
        .leftJoin('customer_user AS cu', 'cu.user_id', 'u.id')
        .where('u.id', '=', id)
        .first()
    );
}

注意:由于在SO上添加table标记的限制,我附上了屏幕截图。

1 个答案:

答案 0 :(得分:2)

实际上,查询工作得很好。由于语法错误,我无法执行它

async getUser(id) {
    return camelizeKeys(
        await knex
        .select(
            'u.id',
            'u.first_name',
            'u.last_name',
            'u.username',
            'u.image_url',
            'u.is_admin',
            'u.phone',
            'u.info',
            'la.email',
            'cu.customer_id',
            'cu.department_id'
        )
        .from('user AS u')
        .leftJoin('local_auth AS la', 'la.user_id', 'u.id')
        .leftJoin('customer_user AS cu', 'cu.user_id', 'u.id')
        .where('u.id', '=', id)
        .first()
    );
}