如何使用 Bookshelf JS 为两个表做一个 WHERE
How to do a WHERE for two tables using Bookshelf JS
我有两个表 users 和 accounts (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 });
})
我有两个表 users 和 accounts (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 });
})