Как правильно разрешить запрос MySql, используя sequelize и Graphql - PullRequest
0 голосов
/ 14 февраля 2020

Я изучаю GraphQL и пытаюсь получить данные из MySql таблиц с помощью секвелирования в функции разрешения на GraphQL. У меня есть таблица клиентов, связанная с таблицей домашних животных, где домашние животные принадлежат клиенту. Вот мой код:

const PetsType = new GraphQLObjectType({
    name: "Pet",
    fields: () => ({
        id: { type: GraphQLString },
        name: { type: GraphQLString },
        breed: { type: GraphQLString },
        type: { type: GraphQLString },
        ClientId: { type: GraphQLString },
        Comments: {
            type: CommentsType,
            resolve(parentValue, args) {
                return db.Comments;
            }
        }
    })
});

const ClientType = new GraphQLObjectType({
    name: "Client",
    fields: () => ({
        id: { type: GraphQLString },
        lastName: { type: GraphQLString },
        firstName: { type: GraphQLString },
        primaryPhoneNumber: { type: GraphQLString },
        cellphone: { type: GraphQLString },
        workPhone: { type: GraphQLString },
        email: { type: GraphQLString },
        Pets: {
            type: PetsType,
            resolve(parentValue, args) {
                return db.Pet.findOne({
                    where: { ClientId: parentValue.id }
                });
            }
        }
    })
}); 

Использование findOne работает для клиентов только с одним домашним животным или возвращает только первое домашнее животное клиента, которому принадлежит более одного. Тем не менее, некоторые клиенты имеют более одного питомца, поэтому findOne () не решает мою проблему. Я пробовал:

return db.Pet.findAll({
                        where: { ClientId: parentValue.id }
                    });

Но он возвращает клиента с полями на Pets null.

Вот мои модели Sequelize для клиентов и для домашних животных: Клиенты:

module.exports = function(sequelize, DataTypes) {
    var Client = sequelize.define(
        "Client",
        {
            lastName: {
                type: DataTypes.TEXT,
                allowNull: false,
                len: [1]
            },
            firstName: {
                type: DataTypes.TEXT,
                allowNull: false,
                len: [1]
            },
            primaryPhoneNumber: {
                type: DataTypes.TEXT,
                allowNull: true,
                len: [1]
            },
            cellphone: {
                type: DataTypes.TEXT,
                allowNull: true,
                len: [1]
            },
            workPhone: {
                type: DataTypes.TEXT,
                allowNull: true,
                len: [1]
            },
            email: {
                type: DataTypes.TEXT,
                allowNull: true,
                len: [1]
            }
        },

        {
            timestamps: false
        }
    );

    Client.associate = function(models) {
        // Associating Clients with Pets
        // When a Client is deleted, also delete any associated Pets
        Client.belongsTo(models.User);
        Client.hasMany(models.Pet, {
            onDelete: "cascade"
        });
    };

    return Client;
};

Домашние животные:

module.exports = function(sequelize, DataTypes) {
    var Pet = sequelize.define(
        "Pet",
        {
            name: {
                type: DataTypes.TEXT,
                allowNull: false,
                len: [1]
            },
            breed: {
                type: DataTypes.TEXT,
                allowNull: false,
                len: [1]
            },
            type: {
                type: DataTypes.TEXT,
                allowNull: true
            }
        },
        {
            timestamps: false
        }
    );

    Pet.associate = function(models) {
        Pet.belongsTo(models.Client);
        Pet.hasMany(models.Comment, {
            onDelete: "cascade"
        });
    };

    return Pet;
};

Как я могу получить всех домашних животных, которые принадлежат этому клиенту? Заранее спасибо.

1 Ответ

1 голос
/ 14 февраля 2020

Как предложил Даниэль Рарден, я изменил его на: type: new GraphQLList (PetsType), чтобы он возвращал список объектов

...