Сиквелизировать ассоциации ForeignKey - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу, чтобы INNER JOIN присоединился к sequelize db: 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 show error:

Выполнение (по умолчанию): ВЫБЕРИТЕ «post». «Id», «post». «Title», "post". "content", "post". "tags", "post". "description", "post". "создал" AS "создал", "post". "обновил" AS "обновил", "user". "id" AS "user.id", "user". "username" AS "user.username", "user". "image" AS "user.image" FROM "публикует" AS "публикует" 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 голосов
/ 06 сентября 2018

Вам лучше использовать '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/

...