Неожиданный результат при запросе совместных таблиц в sequenceize js

Я пытаюсь запросить записи из двух таблиц, которые имеют отношения «один ко многим», используя следующий код, используя sequenceize. В этом случае у одного автора может быть много книг, а книга может быть написана только одним автором.

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» вместо объекта автора, как показано во многих примерах в документах сиквела.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, когда вы используете raw: true, вы получите данные брутто без какого-либо формата и не привязаны ни к какому определению модели.

Если вы хотите продолжить форматирование различных (используя 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

Другие вопросы по теме