将多对多关系化为一张桌子

时间:2020-05-22 23:49:21

标签: javascript node.js postgresql typescript sequelize.js

大家好,我有一个问题。假设我们有社交媒体。

enter image description here

假设用户表看起来像这样。就像在其他社交媒体中一样,用户可以评论其他用户的照片。因此,我们需要一个注释表,该表具有对发布图片的用户和对图片进行注释的用户的引用。 enter image description here

所以我需要找到一种在belongsToMany中制作sequelize的方法。

enter image description here

到目前为止,我有一个account.ts文件


import { AccountAttributes, Repository } from "@eneto/models";
import { DataTypes, Sequelize } from "sequelize";

/**
 * Account factory
 *
 * @param {import("sequelize").Sequelize} sequelize Sequelize database instance.
 * @returns {Repository<AccountAttributes>} Instance of Accounts Entity.
 */
function AccountFactory (sequelize: Sequelize): Repository<AccountAttributes> {
    return sequelize.define("accounts", {
        id: {
            type: DataTypes.BIGINT,
            allowNull: false,
            unique: true,
            primaryKey: true,
            autoIncrement: true,
        },
        username: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true,
        },
        psswrd: {
            type: DataTypes.STRING,
            allowNull: false,
        },
        createdAt: {
            type: DataTypes.DATE,
            allowNull: false,
            defaultValue: DataTypes.NOW,
        },
        updatedAt: {
            type: DataTypes.DATE,
            allowNull: false,
            defaultValue: DataTypes.NOW,
        },
    }) as Repository<AccountAttributes>;
}

export { AccountFactory };

在我的index.ts上,它像:

import { DB } from "@eneto/models";
import { Sequelize } from "sequelize";
import { env } from "../utils/env-vars";
import { AccountInfoFactory } from "./account-info";
import { AccountFactory } from "./accounts";

const sequelize = new Sequelize(env["ENETO_DB_NAME"], env["ENETO_DB_USER"], env["ENETO_DB_PASSWORD"], {
    port: env["ENETO_DB_PORT"],
    host: env["ENETO_DB_HOST"],
    dialect: "postgres",
    pool: {
        min: 0,
        max: 5,
        acquire: 30000,
        idle: 10000,
    },
});

const Accounts = AccountFactory(sequelize);
const AccountTypes = AccountTypesFactory(sequelize);
const AccountAddress = AddressFactory(sequelize);
const SocialMedia = SocialMediaFactory(sequelize);
const Educations = EducationFactory(sequelize);

AccountTypes.hasMany(Accounts);
AccountAddress.hasMany(Accounts);
Accounts.hasMany(SocialMedia);
Accounts.hasMany(Educations);
Accounts.hasMany(Experiences);
Accounts.hasMany(AccountInfo);
Accounts.hasMany(Media);

// I still dont know how to make a
Accounts.belongsToMany(Accounts);

export const db: DB = {
    Accounts,
    sequelize,
};

1 个答案:

答案 0 :(得分:2)

找到答案:

Accounts.belongsToMany(Accounts,{ through: Comments,as: "to", foreignKey: "id" });
Accounts.belongsToMany(Accounts, { through: Comments, as: "from", foreignKey: "id" });