sco*_*ott 9 model node.js sails.js waterline
Sails.js .10 rc8
我完全没有想到这个
我有一个名为User的模型,我想将它在一个集合中与其他用户(如朋友列表)相关联.就像一个多对多的关联
//User.js
friends: {
collection: 'user',
via: 'friends'
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行
.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'
}
}
};
Run Code Online (Sandbox Code Playgroud)
现在,如果您运行,sails console则可以测试以下命令:
User.create({name:'test',email:'test@test.com'}).exec(console.log);
Run Code Online (Sandbox Code Playgroud)
它返回:
{ name: 'test',
email: 'test@test.com',
createdAt: '2016-12-01T22:06:19.723Z',
updatedAt: '2016-12-01T22:06:19.723Z',
id: 1 }
Run Code Online (Sandbox Code Playgroud)
您创建了第一个用户。让我们创建一些其他的:
User.create({name:'test2',email:'test2@test.com'}).exec(console.log);
Run Code Online (Sandbox Code Playgroud)
导致:
{ name: 'test2',
email: 'test2@test.com',
createdAt: '2016-12-01T22:06:40.808Z',
updatedAt: '2016-12-01T22:06:40.808Z',
id: 2 }
Run Code Online (Sandbox Code Playgroud)
让我们看看到目前为止我们有什么:
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 } ]
Run Code Online (Sandbox Code Playgroud)
现在,让我们使用第一个用户的引用来创建一个与朋友一起的用户。请注意,我只传递一个 id,而不是一个数组:
User.create({name:'test3',email:'test3@test.com', friends:1}).exec(console.log);
Run Code Online (Sandbox Code Playgroud)
现在,结果就是这样的。请注意,“朋友”没有出现。这是设计使然。
{ name: 'test3',
email: 'test3@test.com',
createdAt: '2016-12-01T22:07:34.988Z',
updatedAt: '2016-12-01T22:07:34.994Z',
id: 3 }
Run Code Online (Sandbox Code Playgroud)
让我们用 find 来populate查看当前状态:
User.find().populate('friends').exec(console.log);
Run Code Online (Sandbox Code Playgroud)
现在我们看到第三个用户有朋友。其他人有一个空数组。
[ { 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 } ]
Run Code Online (Sandbox Code Playgroud)
让我们创建第四个,这次是和两个朋友一起:
User.create({name:'test4',email:'test4@test.com', friends:[1,2]}).exec(console.log);
Run Code Online (Sandbox Code Playgroud)
结果(同样,没有朋友财产):
{ name: 'test4',
email: 'test4@test.com',
createdAt: '2016-12-01T22:07:50.539Z',
updatedAt: '2016-12-01T22:07:50.542Z',
id: 4 }
Run Code Online (Sandbox Code Playgroud)
这次,我们将一个 ids 数组传递给friends. 让我们看看当前的状态:
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 } ]
Run Code Online (Sandbox Code Playgroud)
现在,如何向现有用户添加好友?这有点奇怪:您必须首先使用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);});});
Run Code Online (Sandbox Code Playgroud)
现在在控制台中我们看不到任何结果。现在让我们检查一下用户内容:
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 } ]
Run Code Online (Sandbox Code Playgroud)
通过这种方法,您甚至可以将同一用户添加到好友集合中!
User.findOne(1).populate('friends').exec(function(err,u){ u.friends.add(1);u.save(function(err){ if(err) console.error(err);});});
Run Code Online (Sandbox Code Playgroud)
玩得开心!
| 归档时间: |
|
| 查看次数: |
3025 次 |
| 最近记录: |