mysql - 如何在 Sequelize 中使用 JOIN LEFT?

标签 mysql node.js sequelize.js

我有两个模型表,例如

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
});   

我需要从两个表中查找所有记录。如何在 Sequelize 中执行此查询?

SELECT * FROM mydb.Projects 
LEFT JOIN  mydb.Tasks ON Projects.id = Tasks.Project_id

我使用:

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'});
    }
  });

};

但我仅从项目获取记录,例如:

Project {
  dataValues: { 
    id: 5,
    name: 'pr2',
    createdAt: 2017-08-20T07:03:09.000Z,
    updatedAt: 2017-08-20T07:41:47.000Z,
    Tasks: [Object] 
  }
}

如何获取记录任务(Project.dataValues.Task)?

最佳答案

所以模型是(说出来:db/models.js):

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):

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);
} 

关于mysql - 如何在 Sequelize 中使用 JOIN LEFT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45780782/

相关文章:

mysql - Sequelize 获取查询的所有数据而不执行我的条件 'where'

mysql - 如果我想优先显示某些条件,如何在 Sequelize for MySQL 中排序?

mysql - MySQL Workbench 的 EER 图编辑器能否表示具有部分/完全不相交/重叠特化关系的表?

javascript - 如何调试打不开的页面(空白页)

javascript - redis sub/pub 进出 io.connect 回调

json - npm 错误! package.json 必须是实际的 JSON,而不仅仅是 JavaScript

mysql - Unique 不适用于 Node.js Sails.js "sails-mysql"

mysql - 有什么办法可以改善这种缓慢的查询吗?

mysql - 导入 MySQL 数据库时遇到问题

node.js - Sequelize - 使用 MariaDB 在 where 子句中进行地理定位