我正在使用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 * .....
答案 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';
您可以在创建动态表后使用它,并将其保存在变量中,这样您就不必在每个查询中继续执行此操作。