Sequelize - Sqlite - проблема с ассоциациями - PullRequest
0 голосов
/ 03 декабря 2018

(извините за мой английский)

Привет всем,

Я создал проект с 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

1 Ответ

0 голосов
/ 03 декабря 2018

Ваш код выглядит хорошо,

Я думаю, что вы, возможно, пропускаете then, так как Model.findAll возвращает Promise,

getPersonBySurname().then(data =>{
    console.log(data); //<----- Check here
});

Таким образом, он будет консольно регистрировать егоили [] или array of data.

В качестве ответа на ваш второй вопрос, ЧИТАЙТЕ

...