KnexJS с несколькими таблицами и псевдонимами

В последнее время я играл с 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(), но это тоже ничего не дало.

Любая помощь или предложение?

Можете ли вы указать вашу проблему? Не понятно, что вы спрашиваете.

coockoo 01.03.2019 14:33

Ну не работает как есть. Код всегда возвращает отказ от обещания, потому что запрос не дает результатов.

MerkisL 01.03.2019 14:35
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
399
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

О, я понял. 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")`

MerkisL 01.03.2019 18:16

и может быть опущен. whereRaw работает так же, как andWhereRaw

coockoo 01.03.2019 18:30

Я использую это для отладки: const builder = knex('tablename').where(...); console.info(builder.toString()); builder.then(...);

coockoo 01.03.2019 18:32

Да, спасибо за подсказку. Оказывается, возникла проблема с моим запросом MySQL. Я добавил .distinct(), и это решило проблему.

MerkisL 01.03.2019 19:00

Другие вопросы по теме