У меня есть две таблицы пользователи и учетные записи (пользователи.id = учетные записи.id), я хочу сделать логин, к которому можно получить доступ из обеих таблиц, users.username ИЛИ account.mail
Я использую BookShelf JS, и я уже пробовал разные способы условия, если users.username = identity не существует, затем проверьте account.mail = identity, и ни один из них не работает
//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']
})
Итак, если задано имя пользователя, то будут переданы пользователи.ид и учетная запись, также если я укажу учетную запись.почта, тогда будут даны учетная запись.идентификатор и пользователи.ид
Я нашел альтернативу, но она работает, если у кого-то есть лучший подход, я готов принять предложения:
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), и если это также равно нулю, отклоните, в противном случае разрешите с правильными полномочиями
Вы можете попробовать реализовать соединение таким образом.
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 });
})