2014-03-25 53 views
4

我目前正在玩Sails.js测试版(v 0.10.0-rc4)中的关联。Sails.js中的多个关联

我想将多个数据库关联到一个结果(使用sails-mysql)。

该协会看起来像这样Post - >TagRelation - >Tag。而当我查询Post表时,我希望返回的对象包含关联的Tag名称。

该机型是这个样子:

// Post model 
var Post = { 
    title: 'string', 
    body: 'string', 
    tag_relations: { 
     collection: 'TagRelation' 
      via: 'post_id' 
    } 
}; 
// Tag Relation model 
var TagRelation = { 
    post_id: { 
     model: 'Post' 
    }, 
    tag_id: { 
     model: 'Tag' 
    } 
}; 
// Tag model 
var Tag = { 
    name: 'string', 
    tag_relations: { 
     collection: 'Tag', 
     via: 'tag_id' 
    } 
}; 

现在,一旦我去http://localhost:1337/post/1我会得到一个tag_relations键JSON对象,包含TagRelation对象的数组,但有办法取而代之的是他们所指的实际Tag对象列表?还是有更好的方法来做到这一点?

回答

8

帆处理连接表给你,所以你不需要TagRelation模型都:

// Post model 
var Post = { 
    title: 'string', 
    body: 'string', 
    tags: { 
     collection: 'tag', 
     via: 'posts', 
     dominant: true // could be on either model, doesn't matter 
    } 
}; 

// Tag model 
var Tag = { 
    name: 'string', 
    posts: { 
     collection: 'post', 
     via: 'tags' 
    } 
}; 

这样的蓝图/post/1将包含所有与其相关的tags。有关更多信息,请参阅association docs - 修复了断开的链接。

dominant:true标签让Sails知道关联的哪一边放置连接表,以防两个模型位于不同的数据库中。当两个模型位于同一个数据库中时,我们正在努力使其成为可选项,但现在必须明确指定它。

+0

我明白了!这似乎工作正常!除了纯粹的mysql查询之外,还有可能计算出有多少“关系”?另外,如果我不想为关系存储额外的数据(即用户标记了什么等),这是可能的吗? –

+0

Sails目前不支持'has-many-through'关系,它允许您存储关于关系的额外数据,尽管它正在开发中。就计数关系而言,你可以执行'Post.findOne(1).populate('tags')。exec(function(err,post){console.log(post.tags.length);})'。有关详细信息,请参阅[填充]的文档(https://github.com/balderdashy/sails-docs/blob/master/reference/ModelMethods.md#populate-foreignkey-)。 – sgress454

+0

好的,谢谢澄清。 –