当前位置: 首页 > 知识库问答 >
问题:

mysql - sequelize v6 的多对对关系,报错Unknown column 'tagsBookmark->bookmarkTag.bookmarkId' in 'field list'?

璩珂
2023-05-08

前端小白,不太懂数据库,业余时间在用 nextjs 和 sequelize 写个小项目,其他 MySQL 问题也跌跌撞撞过来了,但是后面遇到了连表查询、多表关联的问题(belongsToMany),不知问题出在哪里,请大佬帮忙解答,非常感谢!

问题描述: 书签和tag之间属于多对多关系,目前想实现查询某个tag下面对应哪些书签。
报错信息:

"Unknown column 'tagsBookmark->bookmarkTag.bookmarkId' in 'field list'",
    sql: 'SELECT `bookmark`.`id`, `bookmark`.`title`, `bookmark`.`url`, `bookmark`.`image`, `bookmark`.`description`, `bookmark`.`tagsArr`, `bookmark`.`is_favorite`, `tagsBookmark`.`id` AS `tagsBookmark.id`, `tagsBookmark`.`name` AS `tagsBookmark.name`, `tagsBookmark->bookmarkTag`.`id` AS `tagsBookmark.bookmarkTag.id`, `tagsBookmark->bookmarkTag`.`bkId` AS `tagsBookmark.bookmarkTag.bkId`, `tagsBookmark->bookmarkTag`.`tagId` AS `tagsBookmark.bookmarkTag.tagId`, `tagsBookmark->bookmarkTag`.`bookmarkId` AS `tagsBookmark.bookmarkTag.bookmarkId` FROM `bookmark` AS `bookmark` LEFT OUTER JOIN ( `bookmarkTag` AS `tagsBookmark->bookmarkTag` INNER JOIN `tags` AS `tagsBookmark` ON `tagsBookmark`.`id` = `tagsBookmark->bookmarkTag`.`tagId`) ON `bookmark`.`id` = `tagsBookmark->bookmarkTag`.`bookmarkId`;'

image.png

model/bookmark.js


module.exports = (sequelize, DataTypes) => {
  let bookmark = sequelize.define('bookmark', {
    id: {
      type: DataTypes.STRING,
      primaryKey: true,
      autoIncrement: true,
    },
    title: {
      type: DataTypes.STRING, // varchar(255)
      allowNull: false,
      unique: false,
    },
    url: {
      type: DataTypes.STRING, // varchar(255)
      allowNull: false,
      unique: false,
    },
    image: {
      type: DataTypes.STRING, // varchar(255)
      allowNull: true,
      unique: false,
    },
    description: {
      type: DataTypes.STRING, // varchar(255)
      allowNull: true,
      unique: false,
    },
    tagsArr: {
      type: DataTypes.STRING, // varchar(255)
      allowNull: true,
      unique: false,
    },
    is_favorite: {
      type: DataTypes.BOOLEAN, // varchar(255)
      allowNull: true,
      unique: false,
    },
  }, {
    freezeTableName: true, 
    timestamps: false, 
    tableName: 'bookmark',
  });
  bookmark.associate = (models) => {
    models.bookmark.belongsToMany(models.tags,
      {
        as: 'tagsBookmark',
        through: 'bookmarkTag',
      },
    );
  };
  return bookmark;
};

model/tags.js

module.exports = (sequelize, DataTypes) => {
  let tags = sequelize.define('tags', {
    id: {
      type: DataTypes.STRING,
      primaryKey: true,
      autoIncrement: true,
    },
    name: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: false,
    },
  }, {
    freezeTableName: true,
    tableName: 'tags',
    timestamps: false,
  });

  tags.associate = (models) => {
    models.tags.belongsToMany(models.bookmark,
      {
        as: 'tagsBookmark',
        through: 'bookmarkTag',
      },
    );
  };
  return tags;
};

model/bookmarkTag.js

module.exports = (sequelize, DataTypes) => {
  let bookmarkTag = sequelize.define('bookmarkTag', {
    id: {
      type: DataTypes.STRING,
      primaryKey: true,
      autoIncrement: true,
    },
    bkId: {
      type: DataTypes.STRING,
      allowNull: false,
      references: {
        model: sequelize.models.bookmark,
        key: 'id',
      },
    },
    tagId: {
      type: DataTypes.STRING,
      allowNull: false,
      references: {
        model: sequelize.models.tags,
        key: 'id',
      },
    },
  }, {
    freezeTableName: true, 
    tableName: 'bookmarkTag',
    timestamps: false,
  });
  return bookmarkTag;
};

api/tags.js

 const tmp = await models.bookmark.findAll({
          include: {
            model: models.tags,
            as: 'tagsBookmark',
          },
          attributes: ['id'],
        });

问题点:
1、不知道自己的表关联写法有么有问题,不写 as 的话,会报错,写了 as ,但是实际上打算用的关联表是 “bookmarkTag.js”,不明白报错信息为什么会是最上面截图那个。
2、不是非常确定表关联关系是否写得有问题?还烦请后端大佬指出。比如 belongsToMany、associate语法的使用。我用的是 sequelize v6 版本。
再次感谢,困扰了好久了,网上搜索过,但是由于版本变化写写法不一,不知道具体该怎么解决

共有1个答案

有骏奇
2023-05-08

bookmarkTag.js添加外键:

bookmarkTag.belongsTo(models.bookmark, {
  foreignKey: 'bkId',
  as: 'bookmark'
});

bookmarkTag.belongsTo(models.tags, {
  foreignKey: 'tagId',
  as: 'tag'
});

api/tags.js:

const tmp = await models.bookmark.findAll({
  include: {
    model: models.tags,
    as: 'tagsBookmark',
    through: { attributes: [] }, 
  },
  attributes: ['id'],
});
 类似资料:
  • 对于我正在构建的一个类似论坛的网站,我有PHP类'user'和'post‘。用户有一个帖子数组。如何与关系数据库中的连接相似?在“post”上有一个外键,指向一个“user”?这对我来说是有意义的,因为这是一对一的关系,而“user”到“post”是一对多的,就我所见。欢迎有任何想法-谢谢!

  • 文章实体 标签实体 然后我测试新增,随便添加几条数据 查询文章id=1 查询标签id=6 删除文章没问题 但是,删除标签id=6就报错了。服务器错误

  • 我还想知道如何定义每个模型上的关系--你是否需要或者是否可以只在用户上定义关系?

  • 问题内容: 伙计们,我正在努力为我的公司制作一个简单的票证生成系统,以吸引人。目前,我的MSSQL数据库中有一个名为的表,另一个名为的表。 我的应用程序是C#Windows窗体,因此在新的票证生成窗体上,我有许多文本框和一个用于分配工程师的comboBox,由填充。生成票证后,以这种形式输入的所有信息都将与from一起存储。 效果很好,但是后来我的客户要求我添加选项,以便可以在一张票上分配3名工程

  • 问题内容: 我目前正在使用ActiveAndroid,并且在过去的几个小时里一直在尝试建立多对多关系,但是我还是无法正常工作。我希望你能帮助我: 我有“学生”和“课程”的模型,一个学生可以有很多课程,而一个课程有很多学生。基本上,这就是我在“ StudentCourse”模型中所拥有的: 现在,我要做的是使用以下代码获取“课程X中的所有学生”: 但是我收到以下错误: java.lang.Class