Я использую sequelize ORM; все отлично и чисто, но у меня возникла проблема, когда я использую его с join
запросами. У меня две модели: пользователи и посты.
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);
})
Мне нужен запрос, который отвечает сообщением с информацией о пользователе, который его сделал. В необработанном запросе я получаю следующее:
db.seq.query('SELECT * FROM posts, users WHERE posts.user_id = users.id ').success(function(rows){
res.json(rows);
});
У меня вопрос: как изменить код, чтобы использовать стиль ORM вместо SQL-запроса?
источник
SELECT * FROM posts JOIN users ON users.id = posts.user_id WHERE users.year_birth = 1984
User.hasMany(Post)
вы добавляете методы / атрибуты к объекту User, а когда вы вызываете,Post.belongsTo(User)
вы добавляете методы в класс Post. Если вы всегда звоните с одного направления (например, User.getPosts ()), вам не нужно ничего добавлять к объекту Post. Но приятно иметь методы с обеих сторон.Хотя принятый ответ технически не является неправильным, он не отвечает ни на исходный вопрос, ни на последующий вопрос в комментариях, что я и искал. Но я понял это, так что поехали.
Если вы хотите найти все сообщения, в которых есть пользователи (и только те, у которых есть пользователи), SQL будет выглядеть так:
Это семантически то же самое, что и исходный SQL OP:
тогда это то, что вы хотите:
Требуемая установка значения true является ключом к созданию внутреннего соединения. Если вам нужно левое внешнее соединение (где вы получаете все сообщения, независимо от того, есть ли связанный пользователь), измените required на false или оставьте его отключенным, поскольку это значение по умолчанию:
Если вы хотите найти все сообщения, принадлежащие пользователям, чей год рождения - 1984, вам нужно:
Обратите внимание, что required по умолчанию истинно, как только вы добавляете предложение where в.
Если вам нужны все сообщения, независимо от того, прикреплен ли к ним пользователь, но если есть пользователь, то только те, которые родились в 1984 году, добавьте необходимое поле обратно:
Если вам нужны все сообщения с именем «Sunshine» и только если они принадлежат пользователю, родившемуся в 1984 году, вы должны сделать следующее:
Если вам нужны все сообщения с именем «Sunshine» и только если они принадлежат пользователю, родившемуся в том же году, который соответствует атрибуту post_year в сообщении, вы должны сделать следующее:
Я знаю, что это не имеет смысла, чтобы кто-то делал пост в год своего рождения, но это просто пример - продолжайте. :)
Я понял это (в основном) из этого документа:
источник
posts.user_id = users.id
ваш сиквелиз? спасибоисточник
В моем случае я сделал следующее. В UserMaster userId - PK, а в UserAccess userId - FK UserMaster.
источник