Estoy usando sequelize ORM; todo está genial y limpio, pero tuve un problema cuando lo uso con join
consultas. Tengo dos modelos: usuarios y publicaciones.
var User = db.seq.define('User',{
username: { type: db.Sequelize.STRING},
email: { type: db.Sequelize.STRING},
password: { type: db.Sequelize.STRING},
sex : { type: db.Sequelize.INTEGER},
day_birth: { type: db.Sequelize.INTEGER},
month_birth: { type: db.Sequelize.INTEGER},
year_birth: { type: db.Sequelize.INTEGER}
});
User.sync().success(function(){
console.log("table created")
}).error(function(error){
console.log(err);
})
var Post = db.seq.define("Post",{
body: { type: db.Sequelize.TEXT },
user_id: { type: db.Sequelize.INTEGER},
likes: { type: db.Sequelize.INTEGER, defaultValue: 0 },
});
Post.sync().success(function(){
console.log("table created")
}).error(function(error){
console.log(err);
})
Quiero una consulta que responda con una publicación con la información del usuario que la realizó. En la consulta sin procesar, obtengo esto:
db.seq.query('SELECT * FROM posts, users WHERE posts.user_id = users.id ').success(function(rows){
res.json(rows);
});
Mi pregunta es ¿cómo puedo cambiar el código para usar el estilo ORM en lugar de la consulta SQL?
fuente
SELECT * FROM posts JOIN users ON users.id = posts.user_id WHERE users.year_birth = 1984
User.hasMany(Post)
, agrega métodos / atributos al objeto Usuario, y cuando llamaPost.belongsTo(User)
, agrega métodos a la clase Post. Si siempre llama desde una dirección (por ejemplo, User.getPosts ()), no necesita agregar nada al objeto Post. Pero es bueno tener los métodos en ambos lados.Si bien la respuesta aceptada no es técnicamente incorrecta, no responde a la pregunta original ni a la pregunta de seguimiento en los comentarios, que es lo que vine aquí buscando. Pero lo descubrí, así que aquí va.
Si desea encontrar todas las publicaciones que tienen usuarios (y solo las que tienen usuarios) donde el SQL se vería así:
Que es semánticamente lo mismo que el SQL original del OP:
entonces esto es lo que quieres:
La configuración requerida en verdadero es la clave para producir una combinación interna. Si desea una combinación externa izquierda (donde obtiene todas las publicaciones, independientemente de si hay un usuario vinculado), cambie required a false, o déjelo desactivado, ya que es el valor predeterminado:
Si desea encontrar todas las publicaciones que pertenecen a usuarios cuyo año de nacimiento es 1984, querrá:
Tenga en cuenta que required es verdadero de forma predeterminada tan pronto como agregue una cláusula where en.
Si desea todas las publicaciones, independientemente de si hay un usuario adjunto, pero si hay un usuario, solo los nacidos en 1984, agregue el campo requerido nuevamente en:
Si desea todas las publicaciones cuyo nombre es "Sunshine" y solo si pertenece a un usuario que nació en 1984, debe hacer lo siguiente:
Si desea todas las publicaciones cuyo nombre es "Sunshine" y solo si pertenece a un usuario que nació en el mismo año y que coincide con el atributo post_year en la publicación, debe hacer lo siguiente:
Lo sé, no tiene sentido que alguien haga una publicación el año en que nació, pero es solo un ejemplo, hazlo. :)
Descubrí esto (principalmente) de este documento:
fuente
posts.user_id = users.id
en su secuela? graciasfuente
En mi caso hice lo siguiente. En UserMaster userId es PK y en UserAccess userId es FK de UserMaster
fuente