前端小白,不太懂数据库,业余时间在用 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`;'
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 版本。
再次感谢,困扰了好久了,网上搜索过,但是由于版本变化写写法不一,不知道具体该怎么解决
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