2017-08-20 8 views
0

私は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それを言う)に:

+0

これは「eager loading」と呼ばれていますが、実際にORMを使用するのに最適な方法です。ちょっと待ってください。あなたの答えは – num8er

+0

です。「2つのテーブルのすべてのレコード」とはどういう意味ですか?左結合は、内部結合行と、NULLで拡張された不一致の左の表行を戻します。内部結合は、オン条件を満たす左テーブル行と右テーブル行のすべての組み合わせを返します。 [mcve]を読んで行動してください。 – philipxy

+0

@philipxyこれは、プロジェクトとそれに関連するすべてのレコードを取得する必要があることを意味します。 –

答えて

0

ので、モデルは(:db/models.jsそれを言う)です

const Sequelize = require('sequelize'); 
const {Project, Task} = require('../../db/models'); 

module.exports.list = (req, res) => { 
    const query = { 
    include: [{ 
     model: Task, 
     as: 'tasks', 
     required: false 
    }] 
    }; 
    Project 
    .all(query) 
    .then(function (projects) { 
     // it's not recommended, but You insist to get read of model instances and have normal array of objects 
     projects = projects ? projects.map(project => project.toJSON()) : []; 

     res.render(
     'TODOList', 
     { 
      title: 'TODO', 
      projects 
     }); 
     console.log(projects); 
    }) 
    .catch(function (err) { 
     console.error(err); 
     res.render('TODOList', {title: 'TODO List'}); 
    }); 
}; 

しかしsequelizeはsequelizeモデルインスタンスの配列を返しますので、 - それはですdataValues通常のように使用するだけで大​​丈夫です:

for(let project of projects) { 
    console.log(project.tasks[0].name); 
} 
+1

大変感謝しています。私は間違いを理解した –

+0

@ВоваЖуравлёв幸せそれは役立った – num8er

関連する問題