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您可以测试以下命令:

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 }

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

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 } ]

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

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

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

{ 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);

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

 [ { 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 } ]

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

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)

链接地址: http://www.djcxy.com/p/23067.html

上一篇: Sails.js Same Model many to many association

下一篇: Does Akka's event bus guarantee message order?