无法在左连接中保留第一个 table 的 ID

cannot retain id of first table in left join

我正在使用帆水线 ORM,我的模型层中有三个 table

1-s_class

attributes: {
c_title:{
type:'string',
required: true
},
sec:{
   collection:'s_section',
   via:"cls"
  },
  s_session:{
   model:'s_session',
   columnName:'session'
  }

}

2-s_section

 attributes: {
  sec_title:{
type:'string'
},
  sec_priority:{
type:'integer',
required: true
},
  cls:{
   collection:'s_class',
   via:"sec"
  }
}

3-s_form

attributes: {
 studentName:{
  type:'string'
 },
s_class:{
    columnName:'s_class',
    model:'s_class'
  },
   s_section:{
    columnName:'s_section',
    model:'s_section'
  }
}

我将 class 和部分都分配给了保存在 s_form 中的学生 table.when 我写了一个查询来获取学生的记录连同他的 class 和 section.something 像这样:

 s_form.query("SELECT * FROM s_form LEFT OUTER JOIN s_class ON s_form.s_class=s_class.id LEFT OUTER JOIN s_section ON s_form.s_section=s_section.id",function(err,forms){
        if(!err)
        else{
            res.json(forms);
}
    });

它填充部分的记录和 class 但也会影响 s_form.actually 的自动递增主键,这是因为 s_section 和 s_class 也有默认的自动递增主键在填充冲突之后,在这种情况下,我得到了 s_section.

的 id

我想获取 s_form.is 的 ID 有什么方法可以避免这种冲突并覆盖 ID 而不影响主键的默认行为????

备注

s_form table 包含自定义列意味着上面提到的列是静态的,但它也包含在 runtime.that 创建的列,这就是为什么我不能使用内置 populate() 查询方法,我也不能指定列名而不是 select *.....

嗯,首先你可以让帆为你做这件事

s_form.find().populate('').populate('').exec(function(err,forms){/*....*/});

如果您想使用查询,那么您需要明确命名您的字段以避免发生冲突。

而不是SELECT * FROM

您应该指定每个字段,以便重命名 Id 字段以避免这些冲突。

SELECT 
   s_class.c_title, s_class.id as classId,
   s_section.sec_title,s_section.sec_priority,s_section.id as sectionId,
   s_form.studentName,s_form.id as formId
FROM FROM s_form LEFT OUTER JOIN s_class ON s_form.s_class=s_class.id LEFT OUTER JOIN s_section ON s_form.s_section=s_section.id

根据你编辑/更新的 post 你我会在执行查询之前查询查询以检索你的列名,这样你就可以遍历它们并将 table 名称作为前缀传递到每个列名。这将使您避免任何冲突。

您可以使用以下方法获取列名

SELECT * 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' 
    AND `TABLE_NAME`='yourtablename';

您可以在创建动态 table 后使用它,并将其保存在一个变量中,这样您就不必在每次查询时都这样做。