不能保留左连接中第一个表的id

时间:2015-05-16 15:52:11

标签: mysql node.js sails.js waterline

我正在使用sails waterline ORM,我的模型层中有三个表

-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'
  }
}

我为学生分配了课程和课程,这些课程都保存在 s_form 表格中。当我写一个查询来获取学生的记录以及他的课程和部分时,这样:< / p>

 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);
}
    });

它填充了section和class的记录,但也影响了s_form的自动增量primery键。实际上这是因为s_section和s_class也有默认的自动增量primery键,在填充冲突之后,在这种情况下我得到了s_section的id。

我想得到s_form.is的id有什么方法可以避免这种冲突和覆盖id而不影响质量键的默认行为????

注意

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

根据您编辑/更新的帖子,我会在执行查询之前查询查询以检索列名,以便您可以迭代它们并将表名作为前缀传递给每个列名。这样可以避免任何冲突。

您可以使用以下命令获取列名

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

您可以在创建动态表后使用它,并将其保存在变量中,这样您就不必在每个查询中继续执行此操作。