Sequelize Composite Foreign Key

I have a database with the following tables:

CREATE TABLE IF NOT EXISTS `app_user` ( `user_id` INT NOT NULL, `user_name` VARCHAR(45) NOT NULL, PRIMARY KEY (`user_id`)) ENGINE = InnoDB; CREATE TABLE IF NOT EXISTS `user_folder` ( `user_id` INT NOT NULL, `document_id` INT NOT NULL, PRIMARY KEY (`user_id`, `document_id`), CONSTRAINT `fk_user_document_user` FOREIGN KEY (`user_id`) REFERENCES `zinc`.`app_user` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB; CREATE TABLE IF NOT EXISTS `folder_content` ( `user_id` INT NOT NULL, `document_id` INT NOT NULL, `content_id` INT NOT NULL, PRIMARY KEY (`user_id`, `document_id`, `content_id`), CONSTRAINT `fk_folder_content_folder` FOREIGN KEY (`user_id` , `document_id`) REFERENCES `zinc`.`user_folder` (`user_id` , `document_id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB; 

I need to create a Sequelize model to represent it. The only problem I ran into is the relationship of folder_content and user_folder due to the complex key.

How can I create this sequelize model?

This is what I still have:

 var AppUser = sequelize.define('app_user', {userId: {type: Sequelize.INTEGER, primaryKey: true, field: 'user_id'}, ... } ); var UserFolder = sequelize.define('user_folder', {userId: {type: Sequelize.INTEGER, primaryKey: true, field: 'user_id'}, documentId: {type: Sequelize.INTEGER, primaryKey: true, field: 'document_id'}... }); var FolderContent = sequelize.define('folder_content', { userId: {type: Sequelize.INTEGER, primaryKey: true, field: 'user_id'}, documentId: {type: Sequelize.INTEGER, primaryKey: true, field: 'document_id'}, contentId: {type: Sequelize.INTEGER, primaryKey: true, field: 'content_id'}... }); UserFolder.hasMany(FolderContent); FolderContent.belongsTo(UserFolder, {foreingKey: !! });// <- PROBLEM 
+9
source share
1 answer

Sequelize now does not support composite foreign keys. This creates several problems.

  1. When Sequelize creates a table, the table definition does not have a composite FK.
    To solve this problem, I use the afterSync hook for the model and a function that adds FK to the table if it does not exist. Sample code .
  2. When I use the findAll method with the include such a model, I use the include[].on options of the findAll method. Or, if you do not use as many unions as I do, you can use scope when creating an association ( see ).
0
source share

All Articles