【问题标题】:Knex Id Column overwritten by joined table idKnex Id 列被连接表 id 覆盖
【发布时间】:2020-01-28 20:54:48
【问题描述】:

我有一个 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】:

    发生这种情况是因为 node-pg 驱动程序的行为方式。当将更多列连接到行时,具有相同列名的连接列总是会覆盖选择结果中较早的列。

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

    喜欢:

    knex("recipe_details")
        .select("recipe_details.*", "jobs.code", "jobs.description")
        .innerJoin("jobs", "jobs.id", recipe_details.id_job")
        .where("id_recipe", recipeId)
    

    【讨论】:

    • 我找到了相同的解决方法,谢谢@Mikael 提供的信息。
    猜你喜欢
    • 2019-08-11
    • 1970-01-01
    • 2012-03-31
    • 2011-07-24
    • 2017-09-08
    • 1970-01-01
    • 2022-01-16
    • 2014-02-17
    • 1970-01-01
    相关资源
    最近更新 更多