如何使用 Bookshelf JS 为两个表做一个 WHERE

How to do a WHERE for two tables using Bookshelf JS

我有两个表 usersaccounts (users.id = accounts.id), 我想做一个可以从两个表访问的登录,users.username 或 accounts.mail

我正在使用 BookShelf JS,我已经尝试了不同的方法来判断 users.username = 标识不存在,然后检查 account.mail = 标识和 none其中工作

//This code obtains the desired result but only when given the username.
            return UserModel.query((qb) => {
                qb.where('username', identification)
                //.orWhere('account.mail', identification) Something Like This!
            })

            .fetch({
                withRelated: [{ 'account': (qb) => { qb.column('id', 'mail', 'password') } }],
                columns: ['id', 'username']
            })

因此,如果给出 users.username,则将给出 users.id 和 account.id,如果我给出 account.mail,则将给出 account.id 和 users.id将给予

我找到了一个替代方案,虽然它正在工作,如果有人有任何更好的方法,我愿意接受建议:

        return new Promise((resolve, reject) =>
        {
            if(identification == null || password == null) return reject(new Error('invalid_parameters'));

            return UserModel.query((qb) => {
                qb.where('username', identification)
            })

            .fetch({
                withRelated: [{ 'account': (qb) => { qb.column('id', 'mail', 'password') } }],
                columns: ['id', 'username']
            })

            .then((result) =>
            {
                if(result != null)
                {
                    result = result.toJSON();

                    return resolve({id: result.id, username: result.username});
                }

                return AccountModel.query((qb) => {
                    qb.where('mail', identification)
                })
                .fetch({
                    withRelated: [{ 'user': (qb) => { qb.column('id', 'username') } }],
                    columns: ['id', 'mail', 'password']
                })
            })

            .then((result) =>
            {
                if(result == null) return reject(new Error('invalid_login'));

                result = result.toJSON();

                return resolve({id: result.id, username: result.user.username});
            })

            .catch((err) =>
            {
                return reject(err);
            });
        });

我所做的只是检查结果是否不为空,如果不为空,则使用正确的凭据解析,否则如果结果为空,则检查另一个模型 (AccountModel),如果该模型也为空,则拒绝,否则使用正确的凭据解决

你可以试试这样实现join。

import UserModel from './UserModel';

        UserModel.query((qb) => {
            qb.select('users.id as userid','users.username', 'accounts.id as accountid', 'accounts.mail','accounts.password')
            .where('users.username', identification)
            .orWhere('accounts.mail', identification)
            .leftJoin('accounts','users.id','accounts.id')
        })
        .fetch()
        .then(function (details){
           return res.json({ message: "Successfull.", data: details });
        })
        .catch((error) => {
            return res.json({ message: error.message });
        })