Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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 have is with the relation folder_content and user_folder because of the composite key.

How can I create this sequelize model?

This is what I have so far:

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
like image 976
Diego Vidal Avatar asked Jan 30 '26 09:01

Diego Vidal


1 Answers

The solution I came up with was just merging the columns in a view. Then use the view as a replacement for the actual table in sequelize

In you case:

CREATE VIEW user_folder_composite AS SELECT *,CONCAT(`user_id`, `:`,`document_id`) FROM user_folder;

CREATE VIEW folder_content_composite AS SELECT *, CONCAT(`user_id`,`:`, `document_id`,`:` ,`content_id`) FROM folder_content;

Now just you these in your model instead of the original table.

like image 110
Bruno Avatar answered Feb 02 '26 04:02

Bruno