sequelize关联foreignKey

时间:2018-09-06 17:03:44

标签: postgresql associations sequelize.js

我想要使用sequelize db进行INNER JOIN:postgress 我有2个数据库(用户和帖子)

用户

import Sequelize from "sequelize";
import { sequelize } from "../databases/database";
import Post from "./Post";
const User = sequelize.define(
    "user",
    {
        id: {
      type: Sequelize.INTEGER,
      autoIncrement: true,
      primaryKey: true
        },
        username: {
            type: Sequelize.STRING,

        },
        password: {
            type: Sequelize.STRING
        },
        image: {
            type: Sequelize.STRING
        }
    },
    { timestamps: false }
);
User.hasMany(Post, { foreignKey: "author", sourceKey: "username" });
Post.belongsTo(User, { foreignKey: "author", sourceKey: "username" });
export default User;

帖子

import Sequelize from "sequelize";
import { sequelize } from "../databases/database";

const Post = sequelize.define("post", {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true
  },
  title: {
    type: Sequelize.TEXT
  },
  content: {
    type: Sequelize.TEXT
  },
  image: {
    type: Sequelize.STRING
  },
  description: {
    type: Sequelize.TEXT
  },
  tags: {
    type: Sequelize.STRING
  },
  author: {
    type: Sequelize.STRING
  },
  createdAt: {
      field: 'createdat',
      type: Sequelize.DATE
  },
  updatedAt: {
    field: 'updatedat',
    type: Sequelize.DATE
  }
});

export default Post;

控制器

export const listAllPosts = async params => {
    const { offset } = params;

    try {
        const allPosts = await Post.findAll({
            // limit: 20,
            // offset: offset ? offset * 20 : 0,
            // order: [["id", "DESC"]],
            attributes: ["title", "content","tags","description","createdAt","updatedAt"],
            required: true,
            include:[
                {
                    model:User,
                    attributes: ["username", "image"],
                    required:true,
                }
            ]
        });
        return allPosts;
    } catch (error) {
        throw error;
    }
};

当我收集api时显示错误:

  

执行(默认):SELECT“ post”。“ id”,“ post”。“ title”,   “发布”。“内容”,“发布”。“标签”,“发布”。“描述”,   “ post”。“ createdat” AS“ createdAt”,“ post”。“ updatedat” AS“ updatedAt”,   “ user”。“ id” AS“ user.id”,“ user”。“用户名” AS“ user.username”,   “ user”。“ image” AS“ user.image”来自“ posts” AS“ post” INNER JOIN   “ users” AS“ user” ON“ post”。“ author” =“ user”。“ id”;       错误:SequelizeDatabaseError:运算符不存在:text = integer

但是我想显示准确的内容,并且我不想更改primaryKey:

SELECT "post"."title", "post"."content", "post"."tags", "post"."description", "post"."createdat"AS "createdAt", "post"."updatedat" AS "updatedAt", "user"."username" AS "user.username", "user"."image" AS "user.image" FROM "posts" AS "post" INNER JOIN "users" AS "user" ON "post"."author" = "user"."username";

我该怎么做?

1 个答案:

答案 0 :(得分:0)

您最好使用“ userId”,然后再使用“ author”。它会解决您的问题。 并编辑关联

User.hasMany(Post, { foreignKey: "userId", sourceKey: "id" });
Post.belongsTo(User, { foreignKey: "id", sourceKey: "userId" });

并建议您阅读 https://www.essentialsql.com/get-ready-to-learn-sql-database-normalization-explained-in-simple-english/