В последнее время я играл с KnexJS, и у меня есть большая часть того, что мне нужно, из документации KnexJS, однако у меня есть немного более сложный запрос MySQL, который я не могу «перенести» самостоятельно в Knex. Я знаю, что есть возможность использовать .raw(), однако я хотел бы избежать этого, если это возможно.
Мой рабочий запрос MySQL выглядит так:
SELECT A.profile_id, C.model_name, D.brand_name, A.car_plate
FROM carsdb.profiles_has_cars A,
carsdb.profiles B,
carsdb.brands_cars C,
carsdb.brands D
WHERE A.profile_id = B.user_id AND
A.car_id = C.id AND
A.brand_id = D.id;
Что я получил до сих пор:
return new Promise((resolve, reject) => {
db({
A: "profiles_has_cars",
B: "profiles",
C: "brands_cars",
D: "brands"
})
.select("A.profile_id", "C.model_name", "D.brand_name", "A.car_plate")
.where({
"A.profile_id": userId,
"A.car_id": "C.id",
"A.brand_id": "D.id"
})
.then(results => {
if (results > 0) {
resolve(results);
} else {
reject("There is a problem with a query");
}
});
});
Я также пытался использовать объект в качестве аргумента в .where(), но это тоже ничего не дало.
Любая помощь или предложение?
Ну не работает как есть. Код всегда возвращает отказ от обещания, потому что запрос не дает результатов.






О, я понял. knex не понимает, что значения .where на самом деле являются ссылками на другие поля и интерпретируют их как строки.
Попробуйте заменить такие еще на один для каждого .whereRaw("A.car_id = C.id"). (Только для справки, а не для фактических значений).
Хотя это действительно работает, оно возвращает дубликаты для каждой строки. Я не замечал этого раньше. Как мне «связать» несколько where? Вот так: ` .where("A.profile_id", userId) .andWhereRaw("A.car_id = C.id") .andWhereRaw("A.brand_id = D.id")`
и может быть опущен. whereRaw работает так же, как andWhereRaw
Я использую это для отладки: const builder = knex('tablename').where(...); console.info(builder.toString()); builder.then(...);
Да, спасибо за подсказку. Оказывается, возникла проблема с моим запросом MySQL. Я добавил .distinct(), и это решило проблему.
Можете ли вы указать вашу проблему? Не понятно, что вы спрашиваете.