Sequelize: «Включить неожиданное» в запрос связанной таблицы - PullRequest
1 голос
/ 13 апреля 2020

Получение ошибки с таблицей documents включает:

Include unexpected. Element has to be either a Model, an Association or an object.:

const users = await db.users.findAll({
    where: {
      profile_photo: { [Op.ne]: null },
    },
    include: [
      { 
        model: db.documents,
      }
    ],
});

Соответствующие части documents определяют и связывают:

const document = sequelize.define(
    'document',
    {
      id: {
        allowNull: false,
        primaryKey: true,
        type: DataTypes.UUID,
        defaultValue: sequelize.literal('uuid_generate_v4()'),
      },
      user_id: {
        type: DataTypes.UUID,
        references: {
          model: 'users',
          key: 'id',
        },
      },
    }
  );
  document.associate = function(models) {
    models.document.belongsTo(models.users, {
      foreignKey: {
        name: 'user_id',
        allowNull: false,
      },
    });
  };

PSequel возвращает внешний ключ в таблицу документов в виде:

Имя ключа: documents_user_id_fkey

Столбцы: user_id

Иностранная таблица: users

Внешние столбцы: id

И этот запрос psql возвращает документы для пользователя:

SELECT D
FROM users U
INNER JOIN documents D ON D.user_id = U.id

Этот запрос включает запрос, ДЕЙСТВИТЕЛЬНО ли работает с таблицей emails, и возвращает электронные письма пользователю :

const users = await db.users.findAll({
    where: {
      profile_photo: { [Op.ne]: null },
    },
    include: [
      { 
        model: db.emails,
      }
    ],
});

Соответствующие части emails определяют и связывают:

const Emails = sequelize.define(
    'emails',
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: sequelize.literal('uuid_generate_v4()'),
        primaryKey: true,
      },
      user_id: {
        type: DataTypes.UUID,
        references: {
          model: 'users',
          key: 'id',
        },
        allowNull: false,
      },
  );

  Emails.associate = models => {
    models.emails.belongsTo(models.users, {
      onDelete: 'CASCADE',
      foreignKey: {
        name: 'user_id',
        allowNull: false,
      },
    });
  };

PSequel возвращает внешний ключ на таблицу emails как:

Имя ключа: emails_user_id_fkey

Столбцы: user_id

Иностранная таблица: users

Иностранные столбцы: id

Почему не documents таблица ведет себя так же, как emails?

Примечание. Недавно я изменил ассоциацию Sequelize для документов с имени: id на user_id. Нужно ли как-то заново инициировать эту связь?

Изменено с:

    models.document.belongsTo(models.users, {
      foreignKey: {
        name: 'id',
        allowNull: false,
      },
    });

На:

    models.document.belongsTo(models.users, {
      foreignKey: {
        name: 'user_id',
        allowNull: false,
      },
    });

1 Ответ

1 голос
/ 13 апреля 2020

Вы должны указать правильное название модели. Вы можете либо изменить его на это:

const users = await db.users.findAll({
    where: {
      profile_photo: { [Op.ne]: null },
    },
    include: [
      { 
        model: db.document,
      }
    ],
});

Или изменить на это:

const document = sequelize.define('documents', ..

Если вы определите как document, вы должны включить document, а не documents .

...