Я разработчик PHP и для нового проекта решил использовать серверную часть node.js. Так что я новичок в этом.
Я использую knex.js для обработки подключения к базе данных и управления данными. F.ex У меня такой запрос:
let gastronomies = await knex
.from('user')
.innerJoin('profile', 'user.id', 'profile.user_id')
.where('user.status', 1);
Если клиент передает в функцию дополнительную переменную, ее следует использовать как другой параметр запроса.
if (args.lat) {
gastronomies = await knex
.from('user')
.innerJoin('profile', 'user.id', 'profile.user_id')
.where('user.status', 1)
.where('lat', 'like', args.lat); //there it is
}
Я хотел бы связать методы, но это совсем не работает. Вот что я придумал:
let gastronomies = await knex
.from('user')
.select('*', {key: 'user.id'})
.innerJoin('profile', 'user.id', 'profile.user_id')
.where('user.status', 1);
if (args.lat)
gastronomies.where('lat', 'like', args.lat);
Но там сказано, что в гастрономии нет метода под названием «где». Какие-либо предложения?
Ознакомьтесь с документацией - вы можете передать несколько предложений where, используя объект:
.where({
first_name: 'Test',
last_name: 'User'
})
Если вы хотите связать его, вы должны подождать с async/await
, потому что он вызовет вызов базы данных.
Я бы так сделал:
const gastronomies = knex // no await here
.from('user')
.select('*', {key: 'user.id'})
.innerJoin('profile', 'user.id', 'profile.user_id')
.where('user.status', 1);
if (args.lat)
gastronomies.where('lat', 'like', args.lat);
const response = await gastronomies;
Вы также можете проверить ответ на свой вопрос с обещаниями здесь: Могу ли я условно добавить предложение where () к моему запросу knex?
Ваш ответ работает, спасибо! Я строю свой запрос без "ожидания", связываю его с моими условиями, а после этого я просто делаю "return await gastronomies", и он отлично работает!