Maison > interface Web > js tutoriel > Pourquoi Sequelize ne crée-t-il pas ma colonne de clé étrangère dans les associations de modèles ?

Pourquoi Sequelize ne crée-t-il pas ma colonne de clé étrangère dans les associations de modèles ?

Susan Sarandon
Libérer: 2024-12-06 15:16:11
original
617 Les gens l'ont consulté

Why Doesn't Sequelize Create My Foreign Key Column in Model Associations?

Sequelize Model Association ne crée pas de colonne de clé étrangère

Dans Sequelize, une association définit la relation entre deux ou plusieurs modèles. Il fournit un moyen pratique d’accéder aux données associées et d’effectuer des requêtes complexes. Cependant, certains utilisateurs rencontrent un problème où Sequelize ne crée pas de colonne de clé étrangère pour un modèle particulier. Ce problème survient malgré des définitions d'association identiques pour d'autres modèles.

Comprendre la création de clé étrangère

Sequelize créera automatiquement des colonnes de clé étrangère lorsqu'une association est établie entre deux modèles. Cela se produit lorsque la propriété ForeignKey est spécifiée dans les options d'association. Par exemple, dans le modèle User fourni, l’association AppartientTo est définie avec une clé étrangère de role_id. Normalement, cela entraînerait la création d'une colonne role_id dans la table User.

Résoudre le problème

La solution à ce problème consiste à s'assurer que tous les modèles sont enregistrés et associés dans un emplacement central. En centralisant l'enregistrement et l'association des modèles, Sequelize peut gérer correctement les dépendances et créer les colonnes de clé étrangère nécessaires.

Mise en œuvre de l'enregistrement et de l'association centralisés des modèles

Le code suivant montre comment enregistrer et associer des modèles dans un seul fichier :

// database.js

// Register all models in one place
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const db = {};

const models = path.join(__dirname, 'models');

// Create a Sequelize instance
const sequelize = new Sequelize(/* your connection settings here */);

// Register models and add them to the db object
fs.
  readdirSync(models).
  filter(function (file) {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  }).
  forEach(function (file) {
    // Sequelize version <= 5.x
    var model = sequelize['import'](path.join(models, file));
    // Sequelize version >= 6.x
    // var model = require(path.join(models, file))(
    //   sequelize,
    //   Sequelize.DataTypes
    // );
    db[model.name] = model;
  });

// Associate models within the db object
Object.keys(db).forEach(function (modelName) {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.Sequelize = Sequelize; // for accessing static props and functions like Op.or
db.sequelize = sequelize; // for accessing connection props and functions like 'query' or 'transaction'

module.exports = db;
Copier après la connexion

Utilisation Exemple

Dans d'autres modules de votre base de code, vous pouvez accéder à la connexion à la base de données centralisée et utiliser les modèles enregistrés comme ceci :

const db = require('../database');
const { Op } = require('sequelize');

// Use models defined in database.js
const users = await db.user.findAll({
  where: {
    [Op.or]: [
      {
        first_name: 'Smith'
      },
      {
        last_name: 'Smith'
      }
    ]
  }
});
Copier après la connexion

En suivant ces directives, vous pouvez vous assurer que tous vos modèles Sequelize sont correctement associés et que les colonnes de clés étrangères appropriées sont créées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal