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

我正在使用帆水线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表格中。当我编写一个查询来获得学生的logging时,他的课程和部分是这样的:

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

它填充段和类的logging,但也会影响自动增加s_form的主键。实际上,这是因为s_section和s_class也有默认的自动增量主键,在填充冲突后,在这种情况下,我得到了s_section的id。

我想获得s_form.is的ID有任何方法来避免这种冲突和重写的id,而不影响主键的默认行为?

注意

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

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

您可以使用以下来获取列名称

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

您可以在创builddynamic表之后使用它,并将其保存在一个variables中,这样您就不必在每个查询中都这样做。

那么,首先你可以有帆为你做这个

 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