(извините за мой английский)
Привет всем,
Я создал проект с Sequelize и у меня возникла проблема с ассоциацией модели.
У меня есть этомодели (созданные из существующей базы данных sqlite с помощью sequelize-auto):
//Genders.js
module.exports = function(sequelize, DataTypes) {
return sequelize.define('Genders', {
id: {
type: DataTypes.INTEGER,
allowNull: true,
primaryKey: true
},
Type: {
type: DataTypes.TEXT,
allowNull: true
}
}, {
freezeTableName: true,
tableName: 'Genders'
});
};
//Cities.js
module.exports = function(sequelize, DataTypes) {
return sequelize.define('Cities', {
id: {
type: DataTypes.INTEGER,
allowNull: true,
primaryKey: true
},
ExternalId: {
type: DataTypes.TEXT,
allowNull: true
},
Name: {
type: DataTypes.TEXT,
allowNull: true
},
Province: {
type: DataTypes.TEXT,
allowNull: true
},
Description: {
type: DataTypes.TEXT,
allowNull: true
}
}, {
freezeTableName: true,
tableName: 'Cities'
});
};
//Persons.js
module.exports = function(sequelize, DataTypes) {
return sequelize.define('Persons', {
id: {
type: DataTypes.INTEGER,
allowNull: true,
primaryKey: true
},
Name: {
type: DataTypes.TEXT,
allowNull: true
},
Surname: {
type: DataTypes.TEXT,
allowNull: true
},
BirthCity: {
type: DataTypes.INTEGER,
allowNull: true,
references: {
model: 'Cities',
key: 'id'
}
},
Gender: {
type: DataTypes.INTEGER,
allowNull: true,
references: {
model: 'Genders',
key: 'id'
}
},
ResidenceCity: {
type: DataTypes.INTEGER,
allowNull: true,
references: {
model: 'Cities',
key: 'id'
}
},
}, {
freezeTableName: true,
tableName: 'Persons'
});
};
затем, после аутентификации, я импортирую модули с этим кодом:
Persons = db.sequelize.import(__dirname+"/models/Persons.js");
Cities = db.sequelize.import(__dirname+"/models/Cities.js");
Genders = db.sequelize.import(__dirname+"/models/Genders.js");
и устанавливаю ассоциации:
Persons.hasMany(Cities, {as: 'BirthCityField', foreignKey: 'BirthCity', sourceKey: 'id'});
Persons.hasMany(Cities, {as: 'ResidenceCityField',foreignKey: 'ResidenceCity', sourceKey: 'id'});
Persons.hasMany(Genders, {foreignKey: 'Gender', sourceKey: 'id'});
Genders.belongsTo(Persons, {foreignKey: 'Gender', targetKey: 'id'});
Cities.belongsTo(Houseds, {foreignKey: 'BirthCity', targetKey: 'id'});
Cities.belongsTo(Houseds, {foreignKey: 'ResidenceCity', targetKey: 'id'});
Затем я создал эту функцию:
function getPersonBySurname(search) {
return Persons.findAll({
where : {
Surname : {
[Op.like] : search+'%'
}
},
include : [Genders]
});
}
, когда я вызываю функцию, например, search = 'fr', ничего не возвращается, и журнал выглядит так:
SELECT `Persons`.`id`,
`Persons`.`Name`,
`Persons`.`Surname`,
`Persons`.`BirthDate`,
`Persons`.`BirthCity`,
`Persons`.`Gender`,
`Persons`.`Nationality`,
`Persons`.`ResidenceCity`,
`Persons`.`Address`,
`Persons`.`DocumentType`,
`Persons`.`DocumentNumber`,
`Persons`.`FiscalCode`,
`Persons`.`createdAt`,
`Persons`.`updatedAt`,
`Persons`.`OwnerHoused`,
`Persons`.`ComponentHoused`,
`Genders`.`id` AS `Genders.id`,
`Genders`.`Type` AS `Genders.Type`,
`Genders`.`createdAt` AS `Genders.createdAt`,
`Genders`.`updatedAt` AS `Genders.updatedAt`,
`Genders`.`Gender` AS `Genders.Gender`
FROM `Persons` AS `Persons`
LEFT OUTER JOIN `Genders` AS `Genders` ON `Persons`.`id` = `Genders`.`Gender`
WHERE `Persons`.`Surname` LIKE 'fr%';
Я заметил, что «соединение» перевернуто.действительно, «join» должен быть
LEFT OUTER JOIN `Genders` AS `Genders` ON `Persons`.`Gender` = `Genders`.`id`
Любая идея, что я делаю не так?
, если я решу эту проблему, мой следующий вопрос: у меня в Персонале 2 внешний ключ сОдна и та же справочная таблица (Города) в этом случае достаточно для вызова одного включения?Например:
function getPersonBySurname(search) {
return Persons.findAll({
where : {
Surname : {
[Op.like] : search+'%'
}
},
include : [Genders, Cities]
});
}
спасибо
Jempus