【发布时间】:2014-11-21 14:20:02
【问题描述】:
我是 node.js 的新手,也是 Sails.js 框架的新手。
我目前正在尝试使用我的数据库,我不了解 Sails.js 的所有内容,但我设法一步一步地做我想做的事。 (我习惯了一些PHP MVC框架,所以理解结构并不难。)
在这里,我尝试使用 2 JOIN 子句从我的数据库中获取一行。我设法使用SQL 和Model.query() 函数做到了这一点,但我想以一种“更干净”的方式做到这一点。
所以我的数据库中有 3 个表:meta、lang 和 meta_lang。很简单,图胜于言,截图如下。
元
语言
元语言
我想要做的是在meta_table 中获取与'default' meta 和'en' lang 匹配的行(例如)。
这里是 Meta 和 Lang 模型(我使用 sails generate model 命令创建它们并使用我需要的内容进行编辑):
元
module.exports = {
attributes: {
code : { type: 'string' },
metaLangs:{
collection: 'MetaLang',
via: 'meta'
}
}
};
语言
module.exports = {
attributes: {
code : { type: 'string' },
metaLangs:{
collection: 'MetaLang',
via: 'lang'
}
}
};
这是我的 MetaLang 模型,我创建了 3 个函数来测试几种方法。第一个函数findCurrent 运行良好,但如您所见,我必须编写 SQL。如果可能的话,这是我想避免的,我觉得它更干净(我想尽可能多地使用 Sails.js 工具)。
module.exports = {
tableName: 'meta_lang',
attributes: {
title : { type: 'string' },
description : { type: 'text' },
keywords : { type: 'string' },
meta:{
model:'Meta',
columnName: 'meta_id'
},
lang:{
model:'Lang',
columnName: 'lang_id'
}
},
findCurrent: function (metaCode, langCode) {
var query = 'SELECT ml.* FROM meta_lang ml INNER JOIN meta m ON m.id = ml.meta_id INNER JOIN lang l ON l.id = ml.lang_id WHERE m.code = ? AND l.code = ?';
MetaLang.query(query, [metaCode, langCode], function(err, metaLang) {
console.log('findCurrent');
if (err) return console.log(err);
console.log(metaLang);
// OK this works exactly as I want (I would have prefered a 'findOne' result, only 1 object instead of an array with 1 object in it, but I can do with it.)
});
},
findCurrentTest: function (metaCode, langCode) {
Meta.findByCode(metaCode).populate('metaLangs').exec(function(err, metaLang) {
console.log('findCurrentTest');
if (err) return console.log(err);
console.log(metaLang);
// I get what I expected (though not what I want): my meta + all metaLangs related to meta with code "default".
// What I want is to get ONE metaLang related to meta with code "default" AND lang with code "en".
});
},
findCurrentOthertest: function (metaCode, langCode) {
MetaLang.find().populate('meta', {where: {code:metaCode}}).populate('lang', {where: {code:langCode}}).exec(function(err, metaLang) {
console.log('findCurrentOthertest');
if (err) return console.log(err);
console.log(metaLang);
// Doesn't work as I wanted: it gets ALL the metaLang rows.
});
}
};
我还尝试先通过代码获取 Meta,然后通过代码获取 Lang,然后使用 Meta.id 和 Lang.id 获取 MetaLang。但是当我只能有一个查询时,我想避免 3 个查询。
我正在寻找类似MetaLang.find({meta.code:"default", lang.code:"en"}) 的内容。
希望您已获得所有需要的详细信息,如果没有,请发表评论并询问更多信息。
【问题讨论】: