(Извините за мой английский)
всем привет,
Я создал проект с 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%';
Я заметил, что «соединение» перевернуто. действительно, «соединение» должно быть
LEFT OUTER JOIN `Genders` AS `Genders` ON `Persons`.`Gender` = `Genders`.`id`
Есть идеи, что я делаю не так?
Если я решу эту проблему, мой следующий вопрос: у меня есть внешний ключ в лицах 2 с той же справочной таблицей (города), в этом случае достаточно вызвать single include? Например:
function getPersonBySurname(search) {
return Persons.findAll({
where : {
Surname : {
[Op.like] : search+'%'
}
},
include : [Genders, Cities]
});
}
Благодарность
Jempus





Ваш код выглядит хорошо,
Я думаю, вам может не хватать then, так как Model.findAll возвращает Promise,
getPersonBySurname().then(data =>{
console.info(data); //<----- Check here
});
Таким образом, консоль выйдет из системы либо [], либо array of data.
В качестве ответа на ваш второй вопрос: ПРОЧИТАЙТЕ
Спасибо за ответ. Я вызываю функцию в другом модуле и использую обещание, но не получаю ответа ни в «then», ни в «catch». но на полке у меня есть журнал, который я пишу («ВЫБЕРИТЕ
Persons.id, ........»). запрос sql неверен.