在 sequelize 中关联两个表

Posted

技术标签:

【中文标题】在 sequelize 中关联两个表【英文标题】:assotiating two tables in sequelize 【发布时间】:2019-04-14 13:36:05 【问题描述】:

我在关联 2 个模型时遇到问题。我会尽可能详细地描述问题,希望您能帮助我。

我有 2 个模型:Zone 和 PLZ(两者也是 database-mysql 中的表)。 一个 Zone 可以有多个 PLZ,一个 PLZ 可以属于一个 zone。

在保存带有 PLZ 的区域时,我有一个名为“zone_plz”的表,只有两列:zone_id 和 plz_id。两者都有 Zone.id 和 PLZ.id 的外键

区域模型:

const Sequelize = require('sequelize');
const sequelize = require('../util/database');
const PLZ = require('../models/PLZ');
const zone_plz = require('../models/relations/zone_plzs');


const Zone = sequelize.define('zone', 
    name: 
        type: Sequelize.STRING,
        allowNull: false
    ,
    color: 
        type: Sequelize.STRING,
        allowNull: false
    
, 
    timestamps: true
);


module.exports = Zone;

PLZ型号:

const Sequelize = require('sequelize');
const sequelize = require('../util/database');
const Zone = require('../models/Zone');
const zone_plz = require('../models/relations/zone_plzs');


const PLZ = sequelize.define('plz', 
    plz: 
        type: Sequelize.INTEGER,
        allowNull: false
    ,
    city: 
        type: Sequelize.STRING,
        allowNull: false
    ,
    district: 
        type: Sequelize.STRING
    

);


module.exports = PLZ;

这是 zone_plz 模型:

const Sequelize = require('sequelize');
const sequelize = require('../../util/database');
const PLZ = require('../../models/PLZ');
const Zone = require('../../models/Zone');


const zone_plz = sequelize.define('zone_plz', 
    zone_id: 
        type: Sequelize.INTEGER,
        allowNull: false,
        references: 
            model: Zone,
            key: 'id',
        
    ,
    plz_id: 
        type: Sequelize.INTEGER,
        allowNull: false,
        references: 
            model: PLZ,
            key: 'id',
        
    
, 
    timestamps: true
);


module.exports = zone_plz;

这就是我查询它的方式:

router.get('/', function (req, res, next) 

    zone_plz.findAll(
        include: [
            model: PLZ,
            as: 'plz'
        ,
            
                model: Zone,
                as: 'zone'
            ]
    ).then((result) => 
        res.send(status: true, data: result)
    ).catch(function (err) 
        next(err)
    )
);
如您所见,我想将所有属于 plz 的区域返回给用户。

我是续集的新手,我也不确定这是否是正确的方法。我收到错误:plz is not associated to zone_plz!

谁能帮帮我?

【问题讨论】:

【参考方案1】:

您创建了引用,而不是关联。请首先阅读差异:Sequelize model references vs associations 然后在 plz 和 zone 之间创建关联,例如:

plz.belongsToMany(zone, through: 'zone_plz');
zone.belongsToMany(plz, through: 'zone_plz');

【讨论】:

我在我的 zone_plz 模型中写这个但得到错误:PLZ.belongsToMany(Zone, through: 'zone_plz'); ^ TypeError: PLZ.belongsToMany 不是 Object 的函数。 (/Applications/MAMP/htdocs/transport/models/relations/zone_plzs.js:28:5)

以上是关于在 sequelize 中关联两个表的主要内容,如果未能解决你的问题,请参考以下文章

如何在phpmyadmin中关联同一张表的两个字段?

如何覆盖 Grails GORM 中关系的级联删除?

使用自定义连接表主键 Sequelize BelongsToMany

在 Diesel 中关联三个表(多对多关系)的标准模式是啥?

如何在 ActiveRecord 中关联两个加入模型?

如何在 Python 中关联两个音频事件(检测它们是不是相似)