在sequelize js中查询联合表时出现意外输出

时间:2019-05-29 09:56:00

标签: mysql node.js express sequelize.js

我正在尝试使用以下使用sequelize的代码从具有一对多关系的两个表中查询记录。 在这种情况下,一个作者可以拥有很多本书,而一本书只能由一位作者创作。

const BookList = await Book.findAll({
  include: [
    {
      model: Author,
      attributes: ['name'],
    },
  ],
  raw: true,
});

图书模型

const Books = sequelize.define(
  'books',
  {
    id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
    },
    name: {
      type: DataTypes.STRING(255),
      allowNull: false,
    },
    author_id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      references: {
        model: 'authors',
        key: 'id',
      },
    },
  },
  {
    tableName: 'books',
  },
);

作者模型

const Authors = sequelize.define(
  'authors',
  {
    id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
    },
    name: {
      type: DataTypes.STRING(255),
      allowNull: false,
    },
  },
  {
    tableName: 'authors',
  },
);

预期结果如下。

[
  {
    id: 1,
    name: "book1",
    author_id: 1,
    author: {
      name: "tom",
    }
  },
  .....
]

但是我得到的结果如下。

[
  {
    id: 1,
    name: "book1",
    author_id: 1,
    "author.name": "tom"
  },
  .....
]

我的问题是,为什么我要获取“ author.name”而不是续集文档中许多示例中所示的author对象。

1 个答案:

答案 0 :(得分:1)

因此,当您使用raw: true时,您会收到无格式的brut数据,并且该数据不会绑定到任何模型定义。

如果要序列化格式不同的对象(在后台使用dottie.js),则可以使用属性nest: true

const BookList = await Book.findAll({
  include: [
      {
        model: Author,
        attributes: ['name'],
      },
  ],
  raw: true,
  nest: true
});

这里是文档的链接:http://docs.sequelizejs.com/class/lib/sequelize.js~Sequelize.html