2017-02-05 110 views
1

我有兩個由belongsToMany關聯關聯的模型。續集家族綜合關聯:創建一個帖子並將其現有標籤關聯起來

Posts.js:

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var Posts = sequelize.define('Posts', { 
    title: DataTypes.STRING, 
    body: DataTypes.STRING 
    }, { 
    classMethods: { 
     associate: function(models) { 
     Posts.belongsToMany(models.Tags, { 
      through: 'PostsTags', 
      as:'posts_has_tags', 
      foreignKey:'postId' 
     }); 
     } 
    } 
    }); 
    return Posts; 
}; 

和Tags.js:

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var Tags = sequelize.define('Tags', { 
    name: DataTypes.STRING 
    },{ 
    classMethods: { 
     associate: function(models) { 
     Tags.belongsToMany(models.Posts, { 
      through: 'PostsTags', 
      as:'posts_has_tags', 
      foreignKey:'tagId' 
     }); 
     } 
    } 
    }); 
    return Tags; 
}; 

在我的分貝我得到2個現有的標籤。 (id:1和id:2) 我在創建帖子時遇到了麻煩,我想將它與其中一個標籤關聯。

通過運行此代碼:

create: function(request, reply){ 
    let post = Object.assign({}, request.payload, request.params); 

    models.Posts.create({ 
     title: post.title, 
     body: post.body, 
     posts_has_tags: [{tagId:1}] 
    },{ 
     include: [{model:models.Tags, as:'posts_has_tags'}] 
    }).then(function(newPost){ 

     if(!newPost){ 
      return reply('[404] Not found').code(404); 
     } 
     reply(newPost).code(200); 
    }) 
    } 

運行此查詢:

INSERT INTO `Posts` (`id`,`title`,`body`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'TITLE 1','BODY 1','2017-02-05 18:33:21','2017-02-05 18:33:21'); 

Executing (default): INSERT INTO `Tags` (`id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'2017-02-05 18:33:21','2017-02-05 18:33:21'); 

Executing (default): INSERT INTO `PostsTags` (`createdAt`,`updatedAt`,`postId`,`tagId`) VALUES ('2017-02-05 18:33:21','2017-02-05 18:33:21',70,20); 
  1. 它創建了一個新的職位,但也是我不希望有一個新的標籤。
  2. 它創造了poststags表,但用不好的標籤ID
  3. 在承諾如何訪問到setAssociation()或addAssocation()方法sequelize(剛創建的id爲1,而不是之一)的關聯應該創建於belongsToMany協會:

我有錯誤或不確定的,如果我嘗試newPost.addTags或newPost.setTags,或models.Posts.addTags或models.Posts.setTags

如果有人能幫助我,他很受歡迎。 我堅持了這幾天,我想明白我怎麼可以使用sequelize最佳的方式。

回答

0

我改變了別名 「爲」 兩種型號:

Posts.js:

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var Posts = sequelize.define('Posts', { 
    title: DataTypes.STRING, 
    body: DataTypes.STRING 
    }, { 
    classMethods: { 
     associate: function(models) { 
     Posts.belongsToMany(models.Tags, { 
      through: 'PostsTags', 
      as:'postHasTags', 
      foreignKey:'postId' 
     }); 
     } 
    } 
    }); 
    return Posts; 
}; 

Tags.js:

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var Tags = sequelize.define('Tags', { 
    name: DataTypes.STRING 
    },{ 
    classMethods: { 
     associate: function(models) { 
     Tags.belongsToMany(models.Posts, { 
      through: 'PostsTags', 
      as:'tagHasPosts', 
      foreignKey:'tagId' 
     }); 
     } 
    } 
    }); 
    return Tags; 
}; 

兩個別名是相反的。

當我創建一個新的職位或更新一個,我可以訪問在承諾由sequelize(model.setAssociation)建造的二傳手:

upsert: function(request, reply){ 
    let receivedPost = Object.assign({}, request.payload, request.params); 

    models.Posts.find({ 
     where:{ id:receivedPost.id } 
    }).then(post => { 
     if(post){ 
     post.setPostHasTags(receivedPost.tags) 
     reply(post).code(200) 
     } else { 
     models.Posts.create({ 
      title: receivedPost.title, 
      body: receivedPost.body 
     }).then(newPost => { 
      newPost.setPostHasTags(receivedPost.tags) 
      reply(newPost).code(200); 
     }); 
     } 
    }); 
+1

setPostHasTags會返回一個承諾,對吧?在回覆之前,你應該包含一個then()。 –

相關問題