mysql - findbyid - Sequelize.js clave extranjera
sequelize npm (4)
Cuando se usa Sequelize.js, el siguiente código no agrega ninguna clave externa en las tablas.
var MainDashboard = sequelize.define(''main_dashboard'', {
title: Sequelize.STRING
}, {
freezeTableName: true
})
MainClient.hasOne(MainDashboard, { foreignKey: ''idClient'' })
MainDashboard.hasOne(MainClient, { foreignKey: ''clientId'' })
sequelize.sync({ force: true })
¿Hay alguna forma de forzar a Sequelize.js a agregar estas restricciones de clave externa?
Antes tenía el mismo problema y se resolvía cuando entendía el funcionamiento de los ajustes Sequelize.
¡Directo al grano!
Supongamos que tenemos dos objetos: Persona y Padre.
var Person = sequelize.define(''Person'', {
name: Sequelize.STRING
});
var Father = sequelize.define(''Father'', {
age: Sequelize.STRING,
//The magic start here
personId: {
type: Sequelize.INTEGER,
references: ''persons'', // <<< Note, its table''s name, not object name
referencesKey: ''id'' // <<< Note, its a column name
}
});
Person.hasMany(Father); // Set one to many relationship
Tal vez te ayude
Editar:
Puedes leer esto para entender mejor:
http://docs.sequelizejs.com/en/1.7.0/docs/associations/#foreign-keys
Intenté ejecutar tu código y las filas parecen estar bien creadas:
CREATE TABLE IF NOT EXISTS `main_dashboard` (`title` VARCHAR(255), `id` INTEGER NOT NULL auto_increment , `idClient` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `main_client` (`id` INTEGER NOT NULL auto_increment, `clientId` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
clientId
se agrega a main_client
, e idClient
se agrega a main_dashboard
Parece que has confundido un poco lo que hace el método hasOne. Cada vez que llama a hasOne se crea una asociación, por lo que su código asocia efectivamente las dos tablas dos veces. El método que estás buscando es belongsTo
Si desea que cada cliente tenga un panel, el código sería el siguiente:
MainClient.hasOne(MainDashboard, { foreignKey: ''clientId'' })
MainDashboard.belongsTo(MainClient, { foreignKey: ''clientId'' })
Esto crea un campo clientId en la tabla main_dashboard, que se relaciona con el campo id de la tabla main_client
Para abreviar, belongsTo
agrega la relación a la tabla en la que está invocando el método, hasOne
agrega en la tabla que se presenta como argumento.
Necesitas agregar foreignKeyConstraint: true
Tratar
MainClient.hasOne(MainDashboard, { foreignKey: ''idClient'' , foreignKeyConstraint:true })
Para Sequelize 4 esto se ha actualizado a lo siguiente:
const Person = sequelize.define(''Person'', {
name: Sequelize.STRING
});
const Father = sequelize.define(''Father'', {
age: Sequelize.STRING,
personId: {
type: Sequelize.INTEGER,
references: {
model: ''persons'', // ''persons'' refers to table name
key: ''id'', // ''id'' refers to column name in persons table
}
}
});
Person.hasMany(Father); // Set one to many relationship