node.js - query - Sails.js Mismo modelo muchos a muchos asociación
sails query (4)
Sails.js .10 rc8
Me he quedado completamente sin ideas para esto
Tengo un modelo llamado Usuario y quiero asociarlo en una colección a otros usuarios como una lista de amigos. Como una asociación de muchos a muchos
//User.js
friends: {
collection: ''user'',
via: ''friends''
}
pero cuando ejecuto .populate(''friends'')
no puebla nada. ¿Algunas ideas?
Deberías usar .populate(''friends'')
lugar de .populate(friends)
Tus modelos deberían verse así ...
//User.js
friends: {
collection: ''friend'',
via: ''user''
}
//Friend.js
user: {
model: ''user''
via: ''friends''
}
También navega 10 rc8 es viejo. Deberías estar en velas 10.5
Como resultado, cuando tienes una asociación de muchos a muchos en la línea de flotación, debes declarar que uno de los modelos es dominante. Como son el mismo modelo, ninguno está dominado. Mientras se crea una tabla de unión, no hay forma de poblarla.
Creo que la mejor manera de implementar esto es agregar una referencia al id
.
Verifique este modelo de usuario:
module.exports = {
attributes: {
name: {
type: ''string'',
required: true,
minLength: 2
},
email: {
type: ''email'',
required: true,
unique: true
},
friends: {
collection: ''user'',
via: ''id''
}
}
};
Ahora, si ejecuta la sails console
, puede probar los siguientes comandos:
User.create({name:''test'',email:''[email protected]''}).exec(console.log);
Vuelve:
{ name: ''test'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:19.723Z'',
updatedAt: ''2016-12-01T22:06:19.723Z'',
id: 1 }
Usted creó su primer usuario. Vamos a crear algunos otros:
User.create({name:''test2'',email:''[email protected]''}).exec(console.log);
Resultando en:
{ name: ''test2'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:40.808Z'',
updatedAt: ''2016-12-01T22:06:40.808Z'',
id: 2 }
Veamos lo que tenemos hasta ahora:
User.find().populate(''friends'').exec(console.log);
[ { friends: [],
name: ''test'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:19.723Z'',
updatedAt: ''2016-12-01T22:06:19.723Z'',
id: 1 },
{ friends: [],
name: ''test2'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:40.808Z'',
updatedAt: ''2016-12-01T22:06:40.808Z'',
id: 2 } ]
Ahora, creemos un usuario con un amigo, usando la referencia al primer usuario. Tenga en cuenta que solo paso una única identificación, no una matriz:
User.create({name:''test3'',email:''[email protected]'', friends:1}).exec(console.log);
Ahora, el resultado es este. Tenga en cuenta que "amigos" no aparece. Esto es por diseño.
{ name: ''test3'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:07:34.988Z'',
updatedAt: ''2016-12-01T22:07:34.994Z'',
id: 3 }
Hagamos un descubrimiento con populate
para ver el estado actual:
User.find().populate(''friends'').exec(console.log);
Ahora vemos que el tercer usuario tiene amigos. Los otros tienen una matriz vacía.
[ { friends: [],
name: ''test'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:19.723Z'',
updatedAt: ''2016-12-01T22:06:19.723Z'',
id: 1 },
{ friends: [],
name: ''test2'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:40.808Z'',
updatedAt: ''2016-12-01T22:06:40.808Z'',
id: 2 },
{ friends:
[ { name: ''test'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:19.723Z'',
updatedAt: ''2016-12-01T22:06:19.723Z'',
id: 1 } ],
name: ''test3'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:07:34.988Z'',
updatedAt: ''2016-12-01T22:07:34.994Z'',
id: 3 } ]
Vamos a crear un cuarto, esta vez con dos amigos:
User.create({name:''test4'',email:''[email protected]'', friends:[1,2]}).exec(console.log);
Como resultado (de nuevo, no hay propiedad de amigos):
{ name: ''test4'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:07:50.539Z'',
updatedAt: ''2016-12-01T22:07:50.542Z'',
id: 4 }
Esta vez, pasamos una serie de identificaciones a friends
. Veamos el estado actual:
User.find().populate(''friends'').exec(console.log);
[ { friends: [],
name: ''test'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:19.723Z'',
updatedAt: ''2016-12-01T22:06:19.723Z'',
id: 1 },
{ friends: [],
name: ''test2'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:40.808Z'',
updatedAt: ''2016-12-01T22:06:40.808Z'',
id: 2 },
{ friends:
[ { name: ''test'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:19.723Z'',
updatedAt: ''2016-12-01T22:06:19.723Z'',
id: 1 } ],
name: ''test3'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:07:34.988Z'',
updatedAt: ''2016-12-01T22:07:34.994Z'',
id: 3 },
{ friends:
[ { name: ''test'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:19.723Z'',
updatedAt: ''2016-12-01T22:06:19.723Z'',
id: 1 },
{ name: ''test2'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:40.808Z'',
updatedAt: ''2016-12-01T22:06:40.808Z'',
id: 2 } ],
name: ''test4'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:07:50.539Z'',
updatedAt: ''2016-12-01T22:07:50.542Z'',
id: 4 } ]
Ahora, ¿cómo agregar un amigo a un usuario existente? De alguna manera es extraño: primero tiene que find
al usuario, luego usar la función de add
en el modelo resultante y luego, save
. En mi código diario, tengo una función de ayuda que hace precisamente eso. Entonces, aquí está el ejemplo:
User.findOne(1).populate(''friends'').exec(function(err,u){ u.friends.add(3);u.save(function(err){ if(err) console.error(err);});});
Ahora en la consola no vemos resultados. Revisemos el contenido del usuario ahora:
User.find().populate(''friends'').exec(console.log);
[ { friends:
[ { name: ''test3'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:07:34.988Z'',
updatedAt: ''2016-12-01T22:07:34.994Z'',
id: 3 } ],
name: ''test'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:19.723Z'',
updatedAt: ''2016-12-01T22:09:41.410Z'',
id: 1 },
{ friends: [],
name: ''test2'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:40.808Z'',
updatedAt: ''2016-12-01T22:06:40.808Z'',
id: 2 },
{ friends:
[ { name: ''test'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:19.723Z'',
updatedAt: ''2016-12-01T22:09:41.410Z'',
id: 1 } ],
name: ''test3'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:07:34.988Z'',
updatedAt: ''2016-12-01T22:07:34.994Z'',
id: 3 },
{ friends:
[ { name: ''test'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:19.723Z'',
updatedAt: ''2016-12-01T22:09:41.410Z'',
id: 1 },
{ name: ''test2'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:06:40.808Z'',
updatedAt: ''2016-12-01T22:06:40.808Z'',
id: 2 } ],
name: ''test4'',
email: ''[email protected]'',
createdAt: ''2016-12-01T22:07:50.539Z'',
updatedAt: ''2016-12-01T22:07:50.542Z'',
id: 4 } ]
¡Con este método, puedes incluso agregar el mismo usuario a la colección de amigos!
User.findOne(1).populate(''friends'').exec(function(err,u){ u.friends.add(1);u.save(function(err){ if(err) console.error(err);});});
¡Que te diviertas!