无法在左连接中保留第一个 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 后使用它,并将其保存在一个变量中,这样您就不必在每次查询时都这样做。
我正在使用帆水线 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 后使用它,并将其保存在一个变量中,这样您就不必在每次查询时都这样做。