Sails.js相同模型多对多协会

Sails.js .10 rc8

我完全没有想到这个

我有一个名为User的模型,我想将它集合到其他用户(如朋友列表)中。 像一个多对多的关联

//User.js friends: { collection: 'user', via: 'friends' } 

但是当我运行.populate('friends')它不填充任何东西。 有任何想法吗?

我发现实现这个最好的方法实际上是添加一个对id的引用。

检查这个用户模型:

 module.exports = { attributes: { name: { type: 'string', required: true, minLength: 2 }, email: { type: 'email', required: true, unique: true }, friends: { collection: 'user', via: 'id' } } }; 

现在,如果您运行sails console您可以testing以下命令:

 User.create({name:'test',email:'test@test.com'}).exec(console.log); 

它返回:

 { name: 'test', email: 'test@test.com', createdAt: '2016-12-01T22:06:19.723Z', updatedAt: '2016-12-01T22:06:19.723Z', id: 1 } 

您创build了第一个用户。 让我们创build一些其他的:

 User.create({name:'test2',email:'test2@test.com'}).exec(console.log); 

导致:

  { name: 'test2', email: 'test2@test.com', createdAt: '2016-12-01T22:06:40.808Z', updatedAt: '2016-12-01T22:06:40.808Z', id: 2 } 

让我们看看到目前为止:

 User.find().populate('friends').exec(console.log); [ { friends: [], name: 'test', email: 'test@test.com', createdAt: '2016-12-01T22:06:19.723Z', updatedAt: '2016-12-01T22:06:19.723Z', id: 1 }, { friends: [], name: 'test2', email: 'test2@test.com', createdAt: '2016-12-01T22:06:40.808Z', updatedAt: '2016-12-01T22:06:40.808Z', id: 2 } ] 

现在,让我们用一个朋友创build一个用户,使用对第一个用户的引用。 注意,我只传递一个id,而不是一个数组:

 User.create({name:'test3',email:'test3@test.com', friends:1}).exec(console.log); 

现在,结果是这一个。 注意“朋友”没有出现。 这是devise。

 { name: 'test3', email: 'test3@test.com', createdAt: '2016-12-01T22:07:34.988Z', updatedAt: '2016-12-01T22:07:34.994Z', id: 3 } 

让我们做一个查找populate以查看当前状态:

 User.find().populate('friends').exec(console.log); 

现在我们看到第三个用户有朋友。 其他人有一个空arrays。

  [ { friends: [], name: 'test', email: 'test@test.com', createdAt: '2016-12-01T22:06:19.723Z', updatedAt: '2016-12-01T22:06:19.723Z', id: 1 }, { friends: [], name: 'test2', email: 'test2@test.com', createdAt: '2016-12-01T22:06:40.808Z', updatedAt: '2016-12-01T22:06:40.808Z', id: 2 }, { friends: [ { name: 'test', email: 'test@test.com', createdAt: '2016-12-01T22:06:19.723Z', updatedAt: '2016-12-01T22:06:19.723Z', id: 1 } ], name: 'test3', email: 'test3@test.com', createdAt: '2016-12-01T22:07:34.988Z', updatedAt: '2016-12-01T22:07:34.994Z', id: 3 } ] 

让我们来创build第四个,这次有两个朋友:

 User.create({name:'test4',email:'test4@test.com', friends:[1,2]}).exec(console.log); 

导致(再次,没有朋友财产):

  { name: 'test4', email: 'test4@test.com', createdAt: '2016-12-01T22:07:50.539Z', updatedAt: '2016-12-01T22:07:50.542Z', id: 4 } 

这一次,我们向friends传递了一系列ID。 我们来看看目前的状况:

 User.find().populate('friends').exec(console.log); [ { friends: [], name: 'test', email: 'test@test.com', createdAt: '2016-12-01T22:06:19.723Z', updatedAt: '2016-12-01T22:06:19.723Z', id: 1 }, { friends: [], name: 'test2', email: 'test2@test.com', createdAt: '2016-12-01T22:06:40.808Z', updatedAt: '2016-12-01T22:06:40.808Z', id: 2 }, { friends: [ { name: 'test', email: 'test@test.com', createdAt: '2016-12-01T22:06:19.723Z', updatedAt: '2016-12-01T22:06:19.723Z', id: 1 } ], name: 'test3', email: 'test3@test.com', createdAt: '2016-12-01T22:07:34.988Z', updatedAt: '2016-12-01T22:07:34.994Z', id: 3 }, { friends: [ { name: 'test', email: 'test@test.com', createdAt: '2016-12-01T22:06:19.723Z', updatedAt: '2016-12-01T22:06:19.723Z', id: 1 }, { name: 'test2', email: 'test2@test.com', createdAt: '2016-12-01T22:06:40.808Z', updatedAt: '2016-12-01T22:06:40.808Z', id: 2 } ], name: 'test4', email: 'test4@test.com', createdAt: '2016-12-01T22:07:50.539Z', updatedAt: '2016-12-01T22:07:50.542Z', id: 4 } ] 

现在,你如何添加一个朋友到现有的用户? 这有点奇怪:你必须先find用户,然后在生成的模型上使用add函数,然后save它。 在我的日常代码中,我有一个辅助函数可以做到这一点。 所以,这里是例子:

 User.findOne(1).populate('friends').exec(function(err,u){ u.friends.add(3);u.save(function(err){ if(err) console.error(err);});}); 

现在在控制台中,我们看不到任何结果。 现在检查用户内容:

 User.find().populate('friends').exec(console.log); [ { friends: [ { name: 'test3', email: 'test3@test.com', createdAt: '2016-12-01T22:07:34.988Z', updatedAt: '2016-12-01T22:07:34.994Z', id: 3 } ], name: 'test', email: 'test@test.com', createdAt: '2016-12-01T22:06:19.723Z', updatedAt: '2016-12-01T22:09:41.410Z', id: 1 }, { friends: [], name: 'test2', email: 'test2@test.com', createdAt: '2016-12-01T22:06:40.808Z', updatedAt: '2016-12-01T22:06:40.808Z', id: 2 }, { friends: [ { name: 'test', email: 'test@test.com', createdAt: '2016-12-01T22:06:19.723Z', updatedAt: '2016-12-01T22:09:41.410Z', id: 1 } ], name: 'test3', email: 'test3@test.com', createdAt: '2016-12-01T22:07:34.988Z', updatedAt: '2016-12-01T22:07:34.994Z', id: 3 }, { friends: [ { name: 'test', email: 'test@test.com', createdAt: '2016-12-01T22:06:19.723Z', updatedAt: '2016-12-01T22:09:41.410Z', id: 1 }, { name: 'test2', email: 'test2@test.com', createdAt: '2016-12-01T22:06:40.808Z', updatedAt: '2016-12-01T22:06:40.808Z', id: 2 } ], name: 'test4', email: 'test4@test.com', createdAt: '2016-12-01T22:07:50.539Z', updatedAt: '2016-12-01T22:07:50.542Z', id: 4 } ] 

有了这个方法,你甚至可以将同一个用户添加到朋友集合中!

 User.findOne(1).populate('friends').exec(function(err,u){ u.friends.add(1);u.save(function(err){ if(err) console.error(err);});}); 

玩的开心!

你的模型应该像这样

 //User.js friends: { collection: 'friend', via: 'user' } //Friend.js user: { model: 'user' via: 'friends' } 

另外风帆10 rc8是旧的。 你应该在帆10.5

你应该使用.populate('friends')而不是.populate(friends)

事实certificate,当你在水线上有多对多的关联时,你必须声明其中一个模型是主导的。 由于它们是相同的模型,所以都不占主导地位。 在创build连接表时,无法填充它。