Я пытаюсь включить имеет много ассоциаций в findAll, и я получаю ошибку - PullRequest
0 голосов
/ 02 марта 2020

Я хочу вернуть множество ассоциаций из этой модели

module.exports = (sequelize, DataTypes) => {
    const Message = sequelize.define('Message', {
        title: DataTypes.STRING,
        message: DataTypes.STRING,
        userId: DataTypes.STRING,
        teacherId: DataTypes.STRING,

    }, {});
    Message.associate = function(models) {
        Message.belongsTo(models.User, {foreignKey: 'userId'});
        Message.belongsTo(models.Teacher, {foreignKey: 'teacherId'});
        Message.hasMany(models.Reply, {foreignKey: 'messageId'});
    };

    return Message;
}   



модель, которую я хочу включить


module.exports = (sequelize, DataTypes) => {
    const Reply = sequelize.define('Reply', {
        reply: DataTypes.STRING,
        messageId: DataTypes.STRING,

    }, {});
    Reply.associate = function(models) {
        Reply.belongsTo(models.Message, {foreignKey: 'messageId'});
    };

    return Reply;
}   


Я получаю ошибку каждый раз, когда запускаю этот код.

    getUserMessages(req, res){

        const {userId} = req.params;

        Message.findAll({include:[{model:"Reply"}],where: { userId }}).then((e) =>{

            res.json(e);


        }).catch((error) =>{

            console.log(error);

        })

    },


ошибка, которую я получаю, когда пытаюсь получить доступ к контроллеру

 error: column Replies.teacherId does not exist

Как включить эту модель в запрос на поиск всех?

1 Ответ

0 голосов
/ 02 марта 2020

Кажется, что ваши модели не имеют правильных ассоциаций. Вот рабочий пример:

index.ts:

import { sequelize } from '../../db';
import { Model, DataTypes } from 'sequelize';

class User extends Model {}
User.init({}, { sequelize, modelName: 'users' });

class Teacher extends Model {}
Teacher.init({}, { sequelize, modelName: 'teachers' });

class Reply extends Model {}
Reply.init(
  {
    id: {
      primaryKey: true,
      type: DataTypes.INTEGER,
      autoIncrement: true,
      allowNull: false,
    },
  },
  { sequelize, modelName: 'replies' },
);

class Message extends Model {}
Message.init(
  {
    title: DataTypes.STRING,
    message: DataTypes.STRING,
    userId: DataTypes.INTEGER,
    teacherId: DataTypes.INTEGER,
  },
  { sequelize, modelName: 'messages' },
);

const MessageBelongsToUser = Message.belongsTo(User, { foreignKey: 'userId' });
const MessageBelongsToTeacher = Message.belongsTo(Teacher, { foreignKey: 'teacherId' });
Message.hasMany(Reply, { foreignKey: 'messageId' });
Reply.belongsTo(Message, { foreignKey: 'messageId' });

(async function test() {
  try {
    await sequelize.sync({ force: true });
    await Message.create(
      {
        title: 'messsage title',
        message: 'message content',
        user: {},
        teacher: {},
        replies: [{ id: 1 }, { id: 2 }],
      },
      { include: [{ association: MessageBelongsToUser }, Reply, { association: MessageBelongsToTeacher }] },
    );

    const userId = 1;
    const rval = await Message.findAll({ include: [{ model: Reply }], where: { userId }, raw: true });
    console.log('rval: ', rval);
  } catch (error) {
    console.log(error);
  } finally {
    await sequelize.close();
  }
})();

Результат выполнения кода выше:

rval:  [ { id: 1,
    title: 'messsage title',
    message: 'message content',
    userId: 1,
    teacherId: 1,
    'replies.id': 1,
    'replies.messageId': 1 },
  { id: 1,
    title: 'messsage title',
    message: 'message content',
    userId: 1,
    teacherId: 1,
    'replies.id': 2,
    'replies.messageId': 1 } ]

Проверка записей данных в базе данных:

node-sequelize-examples=# select * from users;
 id
----
  1
(1 row)

node-sequelize-examples=# select * from replies;
 id | messageId
----+-----------
  1 |         1
  2 |         1
(2 rows)

node-sequelize-examples=# select * from messages;
 id |     title      |     message     | userId | teacherId
----+----------------+-----------------+--------+-----------
  1 | messsage title | message content |      1 |         1
(1 row)

node-sequelize-examples=# select * from teachers;
 id
----
  1

исходный код: https://github.com/mrdulin/node-sequelize-examples/tree/master/src/examples/stackoverflow/60479744

...