Node.js Sails.js-使用多连接获取对象(模型)

Node.js Sails.js-使用多连接获取对象(模型),node.js,sails.js,Node.js,Sails.js,我是node.js新手,对Sails.js框架比较新 我目前正在尝试使用我的数据库,我不了解Sails.js的所有内容,但我一步一步地做到了我想要的。(我已经习惯了一些PHP MVC框架,因此理解其结构并不太困难。) 在这里,我试图使用2JOIN子句从数据库中获取一行。我使用SQL和Model.query()函数实现了这一点,但我希望以“更干净”的方式实现这一点 所以我的数据库中有3个表:meta、lang和meta_lang。它非常简单,图片比文字要好,下面是一些截图 meta module.

我是node.js新手,对Sails.js框架比较新

我目前正在尝试使用我的数据库,我不了解Sails.js的所有内容,但我一步一步地做到了我想要的。(我已经习惯了一些PHP MVC框架,因此理解其结构并不太困难。)

在这里,我试图使用2
JOIN
子句从数据库中获取一行。我使用
SQL
Model.query()
函数实现了这一点,但我希望以“更干净”的方式实现这一点

所以我的数据库中有3个表:meta、lang和meta_lang。它非常简单,图片比文字要好,下面是一些截图

meta

module.exports = {
    attributes: {
        code : { type: 'string' },
        metaLangs:{
            collection: 'MetaLang',
            via: 'meta'
        }
    }
};

lang

module.exports = {
    attributes: {
        code : { type: 'string' },
        metaLangs:{
            collection: 'MetaLang',
            via: 'lang'
        }
    }
};

meta_lang

module.exports = {
    attributes: {
        code : { type: 'string' },
        metaLangs:{
            collection: 'MetaLang',
            via: 'lang'
        }
    }
};

我想做的是获取
meta_表中与'default'meta和'en'lang匹配的行(例如)

下面是Meta和Lang模型(我使用
sails generate model
命令创建了它们,并根据需要对它们进行了编辑):

Meta

module.exports = {
    attributes: {
        code : { type: 'string' },
        metaLangs:{
            collection: 'MetaLang',
            via: 'meta'
        }
    }
};
Lang

module.exports = {
    attributes: {
        code : { type: 'string' },
        metaLangs:{
            collection: 'MetaLang',
            via: 'lang'
        }
    }
};
这是我的MetaLang模型,我创建了3个函数来测试几种方法。第一个函数,
findCurrent
,工作得很好,但正如您所看到的,我必须编写SQL。这就是我想要避免的,如果可能的话,我发现它更干净(我希望尽可能经常使用Sails.js工具)

我还尝试先通过代码获取Meta,然后通过代码获取Lang,并使用Meta.id和Lang.id获取MetaLang。但我想避免3个查询,因为我只能有一个查询

我要找的是类似于
MetaLang.find({meta.code:“default”,lang.code:“en”})的东西

希望您已经获得了所有需要的详细信息,如果您没有,请发表评论并询问更多信息。

您是否尝试过:

findCurrentTest: function (metaCode, langCode) {
    Meta.findByCode(metaCode).populate('metaLangs', {where: {code:langCode}}).exec(function(err, metaLang) {
        console.log('findCurrentTest');
        if (err) return console.log(err);
        console.log(metaLang);
    });
},

你知道这是做什么用的吗?它用于在从数据库加载整个关联对象时包含该对象。实际上,这就是您正在尝试的连接,如果您只需要行检索,那么查询表而不填充将使您构建的两个函数都工作

在我看来,你是在写Sails是如何参与协会的。我建议给这些关联文档另一个读入。根据您的情况,您只是在尝试与每个表进行一对多的关联,因此在我的猜测中,您可以避免使用中间表,但为了更好地做出决定,我需要了解您的用例

当我看到mySQL代码时,在我看来,你仍然在考虑mySQL和PHP,这需要时间来转换:)自己强制连接和中间表,为你重做很多东西。我在“磁盘”适配器上重做了您的示例,它工作得非常好。WaterlineORM的全部要点是,除非绝对必要,否则将抽象到SQL层。
以下是我为您的示例所做的操作,首先,在磁盘适配器id上不使用SQL创建模型:

  // Lang.js
  attributes: {
    id :{ type:  "Integer" , autoIncrement : true,  primaryKey: true },
    code :"string"
  }
你知道我在这里做了什么吗?我并不真的需要Id部分,因为Sails为我做的。只是一个例子

  // Meta.js
  attributes: {
    code :"string"
  }
更好:)

现在,在创建与示例相同的值之后,我运行sails控制台类型:

 MetaLang.find({meta_id : 1 ,lang_id:2}).exec(function(er,res){
  console.log(res);
 });
输出>>>

sails> [ { meta_id: 1,
    lang_id: 2,
    title: 'My blog',
    id: 2 } ]
现在,如果您想显示id为1的meta和id为2的lang,我们使用populate,但是join/search的引用就这么简单

sails> Meta_lang.find({meta_id : 1 ,lang_id:2}).populate('lang_id').populate('meta_id').exec(function(er,res){ console.log(res); });
undefined
sails> [ { 
  meta_id: 
     { code: 'default',
       id: 1 },
  lang_id: 
     { code: 'En',
       id: 2 },
    title: 'My blog',
    id: 2 } ]
此时,id将适配器切换到MySQL,然后使用与上面相同的列名创建MySQL表。创建FK_约束,瞧。
您可以添加的另一个严格策略是在每个模型上设置“via”和支配地位。您可以在关联文档中了解更多信息,这取决于关联的性质(多对多等)

要在不知道ID的情况下获得相同的结果,请执行以下操作:

sails> Meta.findOne({code : "default"}).exec(function(err,needed_meta){
..... Lang.findOne({code : "En"}).exec(function(err_lang,needed_lang){
....... Meta_lang.find({meta_id : needed_meta.id , lang_id : needed_lang.id}).exec(function(err_all,result){
......... console.log(result);});
....... });
..... });
undefined
sails> [ { meta_id: 1,
    lang_id: 2,
    title: 'My blog',
    id: 2 } ]

这只返回“meta”表中的数据,“metaLang”为空<代码>[{metaLangs:[],代码:'default',id:1}]
。我会在那个方向尝试其他东西,谢谢!这个答案对我很有帮助。我以前没有意识到我可以查询“填充”方法。谢谢你的详细回答。我现在没有时间测试所有东西(今晚我会仔细看看)。只是一些评论。:)
当我看到mySQL代码时,我觉得您仍然在考虑mySQL和PHP,这需要时间来从
=>转换,对吧^^“但是我不得不使用SQL,因为我没有找到在没有SQL的情况下如何使用SQL,我从
find()
populate()开始
在我的对象上没有成功。我看到你正在通过meta_id和lang_id获取MetaLang对象,那么通过meta_代码和lang_代码获取它们如何呢?我仍然不知道如何才能不必1/通过代码找到我的meta,2/通过代码找到我的lang,3/通过id找到我的MetaLang。非常感谢你花时间回答这个问题。:)它这是一种异步语言和框架,您查询Lang表,并在第二次查询回调时将回调设置为query Meta table,您已经有了这两个ID,您查询了第三个表,在第三次回调时,您将返回到客户机并得到结果。这是一个非常有效的问题,不幸的是,我不是这方面的专家,但我想我ts是Node.js与其他技术的基础,异步与同步。是的,它有3个查询,但有3个非阻塞、超级复制器快速io读取,这要归功于v8和Node。将其与表中的1个阻塞进行比较,这将花费3倍的时间。在这3个快速查询之间,可能有另一个客户端得到了服务。这实际上取决于应用程序的性质,需要多少时间低需求的当前交通与高需求的单线交通。