【问题标题】:graphQL with Sequelize and Mysql duplicate field in relationgraphQL 与 Sequelize 和 MySQL 重复字段相关
【发布时间】:2019-04-17 17:12:22
【问题描述】:

https://www.graphqlbin.com/v2/gLg9FP

我现在被这个问题困扰了一天,需要有人帮助。 我有 2 个续集模型

      module.exports = (sequelize, DataTypes) => {
            const Periodo = sequelize.define('periodo', {
...
                    cod_casa: {
                        type: DataTypes.INTEGER(11),
                        allowNull: false,
                        field: 'cod_casa'
                    },
                   ....
                },
     ...
            );

            Periodo.associate = (models) => {
                Periodo.belongsTo(models.casa);
            };

            return Periodo;
        }

  const Casa = sequelize.define('casa', {
                cod_casa: {
                    type: DataTypes.INTEGER(11),
                    allowNull: false,
                    primaryKey: true,
                    autoIncrement: true,
                    field: 'cod_casa'
                },

.....
    Casa.associate = (models) => {
        Casa.hasMany(models.periodo);
    };

    return Casa;
}

但是graphQl总是返回错误:

“扩展”:{ “代码”:“INTERNAL_SERVER_ERROR”, “例外”: { "name": "SequelizeDatabaseError", “父母”:{ "代码": "ER_BAD_FIELD_ERROR", “错误”:1054, "sqlState": "42S22", "sqlMessage": "'字段列表'中的未知列 'casaCodCasa'", "sql": "SELECT id, cod_casa, inicio, fim, preco_semana AS precoSemana, preco_dia AS precoDia, preco_fimsemana AS estadia_minimaAS estadia_minima, estadiaMinima, descricao, observacoes, createdAt, updatedAt, casaCodCasa FROM periodo AS periodo WHERE periodo.casaCodCasa = 23;" },

问题似乎出在关系定义上。 我还定义了解析器和 graphQL 模式。 有人遇到过这样的事情吗? 提前致谢。

【问题讨论】:

    标签: mysql sequelize.js graphql relationship


    【解决方案1】:

    您需要自定义外键,因为您没有使用默认主键作为 id

    Periodo.belongsTo(models.casa,{foreignKey: 'cod_casa'}); // <--- HERE
    

    根据DOC

    const User = this.sequelize.define('user', {/* attributes */})
    const Company  = this.sequelize.define('company', {/* attributes */});
    
    User.belongsTo(Company); // Will add companyId to user
    
    const User = this.sequelize.define('user', {/* attributes */}, {underscored: true})
    const Company  = this.sequelize.define('company', {
      uuid: {
        type: Sequelize.UUID,
        primaryKey: true
      }
    });
    
    User.belongsTo(Company); // <----- Will add company_uuid to user
    

    注意:User.belongsTo(Company); //

    【讨论】:

    • 我正在使用主键 const Periodo = sequelize.define('periodo', { id: { type: DataTypes.INTEGER(11), allowNull: false, primaryKey: true, autoIncrement: true, field : 'id' }, cod_casa: { type: DataTypes.INTEGER(11), allowNull: false, field: 'cod_casa' },
    • 是的,但不在 casa 表中,这就是为什么按照我的建议更改行并运行您的代码。
    • 我已经改变了行...完全没有效果。也许问题是因为 Casa 的主键与 Periodo 的外键同名?
    • 无法共享本地主机
    • 如果我使用查询 { periodos { casaid } }
    【解决方案2】:

    修复由关系/关联定义中的自定义外键选项组成 例如:

    Periodo.associate = (models) => {
            Periodo.belongsTo(models.casa,**{foreignKey: 'cod_casa'}**);
        };
    

    Casa.associate = (models) => {
            Casa.hasMany(models.periodo,**{ foreignKey: 'cod_casa' }**);
            Casa.hasMany(models.feedback,{ foreignKey: 'cod_casa' });
        };
    

    正如@Vivek Doshi 所说,但适用于两种模型。

    【讨论】:

      猜你喜欢
      • 2020-05-23
      • 2012-05-21
      • 2018-09-07
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 2020-04-11
      相关资源
      最近更新 更多