Knex Id列被连接的表ID覆盖

问题描述 投票:1回答:1

我有一个REST API端点,该端点返回定义如下的内部联接记录集:

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属性,该属性不是主表的属性,而是被SQL语句返回的最后一个id字段覆盖。

如何避免这种行为?谢谢您的帮助

database postgresql knex.js
1个回答
0
投票

发生这种情况是由于node-pg驱动程序的行为。当一个人将更多的列联接到行时,具有相同列名的联接列将始终覆盖选择结果中的较早列。

您可以通过明确告诉要为结果行选择哪些列来解决此问题。

例如:

knex("recipe_details")
    .select("recipe_details.*", "jobs.code", "jobs.description")
    .innerJoin("jobs", "jobs.id", recipe_details.id_job")
    .where("id_recipe", recipeId)
© www.soinside.com 2019 - 2024. All rights reserved.