2014-03-25 92 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

好的,謝謝澄清。 –