私はSequelizeでJOIN LEFTを使用するにはどうすればよいですか?
Project = Sequelize.define('Project',{
name: Sequelize.STRING
});
Task = Sequelize.define('Task',{
name:Sequelize.STRING,
status: Sequelize.BOOLEAN,
deadline: Sequelize.DATE,
from_name: Sequelize.STRING,
ProjectId: Sequelize.INTEGER
});
のように私は2つのテーブルからすべてのレコードを検索する必要があり、二つのモデルのテーブルを持っています。 Sequelizeでこのクエリを実行するにはどうすればよいですか?私はレコードのタスク(Project.dataValues.Task)を取得できますか
Project {
dataValues: {
id: 5,
name: 'pr2',
createdAt: 2017-08-20T07:03:09.000Z,
updatedAt: 2017-08-20T07:41:47.000Z,
Tasks: [Object]
}
}
:のように、
exports.list = function (req, res) {
Project.hasMany(Task,{ foreignKey: { allowNull: false }, onDelete: 'CASCADE' });
Project.all({
include: [{
model: Task,
required:false,
where:{ProjectId: Sequelize.col('Project.id')}
}]
})
.then(function (projects) {
res.render('TODOList', {title: 'TODO', projects: projects || [] });
console.log(projects);
})
.catch(function (err) {
if (err) {
res.render('TODOList', {title: 'TODO List'});
}
});
};
を、私は唯一のプロジェクトからレコードを取得する:
SELECT * FROM mydb.Projects
LEFT JOIN mydb.Tasks ON Projects.id = Tasks.Project_id
私が使用して?
const
Project = Sequelize.define(
'Project',
{
name: Sequelize.STRING
}),
Task = Sequelize.define(
'Task',
{
name: Sequelize.STRING,
status: Sequelize.BOOLEAN,
deadline: Sequelize.DATE,
from_name: Sequelize.STRING,
ProjectId: Sequelize.INTEGER
});
// relations must be defined once in model definition part (not like You do in every request
Project.hasMany(Task, {foreignKey: {allowNull: false}, onDelete: 'CASCADE'});
Task.belongsTo(Project);
module.exports = {Project, Task};
し、ルータのハンドラ(routes/projects/list.js
それを言う)に:
これは「eager loading」と呼ばれていますが、実際にORMを使用するのに最適な方法です。ちょっと待ってください。あなたの答えは – num8er
です。「2つのテーブルのすべてのレコード」とはどういう意味ですか?左結合は、内部結合行と、NULLで拡張された不一致の左の表行を戻します。内部結合は、オン条件を満たす左テーブル行と右テーブル行のすべての組み合わせを返します。 [mcve]を読んで行動してください。 – philipxy
@philipxyこれは、プロジェクトとそれに関連するすべてのレコードを取得する必要があることを意味します。 –