Столбец Knex Id перезаписывается идентификатором объединенной таблицы - PullRequest
1 голос
/ 27 января 2020

У меня есть конечная точка API REST, которая возвращает набор записей внутреннего соединения, определенный следующим образом:

const getByRecipeId = recipeId => {
  return knex("recipe_details")
    .innerJoin("jobs", "jobs.id", recipe_details.id_job")
    .where("id_recipe", recipeId)
}

При отладке у меня есть следующий оператор sql (Postgres):

select
    *
from
    "recipe_details"
inner join "jobs" on
    "jobs"."id" = "recipe_details"."id_job"
where
    "id_recipe" = 1

Возвращает этот набор записей

id|id_recipe|seq|id_job|qty_time|qty_job|id|code|description|
--|---------|---|------|--------|-------|--|----|-----------|
 1|        1| 10|     1|      10|     24| 1|job1|job descr1 |
 3|        1| 30|     2|      15|     24| 2|job2|job descr2 |
13|        1| 50|     3|      50|     15| 3|job3|job descr3 |
 2|        1| 20|     3|       5|     30| 3|job3|job descr3 |
 4|        1| 40|     3|      25|     24| 3|job3|job descr3 |

Как видите, есть два поля id, одно для таблицы recipe_details и одно для таблицы jobs.

Проблема в том, что объект javascript, возвращаемый конечной точкой, имеет только одно свойство id, которое не относится к основной таблице, но перезаписывается последним полем id, возвращаемым оператором SQL.

Как я могу избежать этого поведения? Спасибо за вашу помощь

1 Ответ

0 голосов
/ 28 января 2020

Это происходит из-за поведения драйвера node-pg. При объединении нескольких столбцов в строку объединенные столбцы с одинаковым именем столбца всегда перезаписывают более ранние в результатах выбора.

Это можно обойти, явно указав, какие столбцы выбрать для строки результата.

Как:

knex("recipe_details")
    .select("recipe_details.*", "jobs.code", "jobs.description")
    .innerJoin("jobs", "jobs.id", recipe_details.id_job")
    .where("id_recipe", recipeId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...