Nodejs sequelize、mysql 问题求解答 一张表多个关联关系问题

发布于 1周前 作者 itying888 来自 nodejs/Nestjs

Nodejs sequelize、mysql 问题求解答 一张表多个关联关系问题

image

Worker.hasMany(Worker_task, { foreignKey: 'worker_id' })
Worker_task.belongsTo(Worker, { foreignKey: 'worker_id', targetKey: 'id' })
Worker.hasMany(Worker_task, { foreignKey: 'other_workerid' })
Worker_task.belongsTo(Worker, { foreignKey: 'other_workerid', targetKey: 'id' })

上面是我的数据表关系。worker_task表中worker_id 字段指向worker.id,为一对多关系。

worker_task表中other_workerid字段同样指向worker.id,为一对多关系。

业务简化逻辑

员工、员工任务。员工甲委派任务给员工乙,worker_id就是甲的 id,other_workerid就是乙的 id 。

现在要通过,worker_task 表查询出,worker_id 和 other_workerid 对应的信息。下边是我的 sequelize 查询语句。

// workerId
const data = await Worker_task.findAndCountAll({
  attributes: ['worker_id', 'task_id', 'trust_relation', 'other_workerid'],
  include: [
    // TODO 现在查出来,是 other_workerid 对应的 worker 。我想把 worker_id 和 other_workerid 对应的 worker 记录都查询出来。
    { model: Worker, attributes: ['name'] },
  ],
  where: {
    [Op.or]: [
      {
        worker_id: workerId,
      },
      {
        other_workerid: workerId,
      },
    ],
  },
})

求助 sequelize 语句或者原始 mysql 语句。或者换其他可行的思路也是 ok 的,提前谢谢大家!


6 回复

<br>select * from work_task as t1<br>left join worker as t2 on t1.worker_id = <a target="_blank" href="http://t2.id" rel="nofollow noopener">t2.id</a> or t1.other_worker_id = <a target="_blank" href="http://t2.id" rel="nofollow noopener">t2.id</a><br>


试试这个:

select
t0.*
,t1.name
,t2.name
from work_task t0
left join worker as t1 on t0.other_worker_id = t1.id
left join worker as t2 on t0.worker_id = t2.id

建立关联的时候加个 alias 试试:
<br>Worker.hasMany(Worker_task, { foreignKey: 'worker_id', as: 'worker'})<br>Worker.hasMany(Worker_task, { foreignKey: 'other_workerid' , as: 'other_worker'})<br><br>include: [<br> { model: Worker, attributes: ['name'], as: 'worker' },<br> { model: Worker, attributes: ['name'], as: 'other_worker' },<br>]<br>

谢谢两位。用三楼的的方法了,mysql 还不太熟。 谢谢!谢谢!🙏

解决了!谢谢老哥。此方法有效。

在Node.js中使用Sequelize与MySQL处理一张表具有多个关联关系的问题,可以通过定义模型(Model)和关联(Association)来实现。以下是一个简单的示例,展示如何设置一对多(One-to-Many)和多对多(Many-to-Many)关联关系。

首先,确保你已经安装了必要的包:

npm install sequelize mysql2

然后,定义你的模型。例如,我们有一个User模型和一个Post模型,一个用户可以有多个帖子(一对多),同时一个帖子也可以被多个用户收藏(多对多)。

const { Sequelize, DataTypes, Model } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'
});

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

class Post extends Model {}
Post.init({
  title: DataTypes.STRING,
  content: DataTypes.TEXT,
}, { sequelize, modelName: 'Post' });

User.hasMany(Post);
Post.belongsTo(User);

// 多对多关联示例(收藏关系)
User.belongsToMany(Post, { through: 'UserPosts' });
Post.belongsToMany(User, { through: 'UserPosts' });

sequelize.sync();

在这个示例中,UserPost之间建立了一对多关系,同时UserPost之间还通过UserPosts表建立了多对多关系。sequelize.sync()方法会同步所有模型到数据库。

希望这个示例能帮助你理解如何在Node.js中使用Sequelize处理一张表的多个关联关系。

回到顶部