2017-06-16 63 views
0

我使用Sequelize Auto來生成我的數據庫定義。在定義內部,它定義哪些列是具有「引用」屬性的外鍵。然而,如何將Sequelize Auto中的引用變爲Sequelize中的關聯?

$ cat models/account.js 
/* jshint indent: 2 */ 

module.exports = function(sequelize, DataTypes) { 
    return sequelize.define('account', { 
    id: { 
     type: DataTypes.BIGINT, 
     allowNull: false, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    parent_account_id: { 
     type: DataTypes.BIGINT, 
     allowNull: false, 
     references: { 
     model: 'account', 
     key: 'id' 
     } 
    }, 
    master_account_id: { 
     type: DataTypes.BIGINT, 
     allowNull: false, 
     references: { 
     model: 'account', 
     key: 'id' 
     } 
    }, 
    name: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 
    description: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     defaultValue: '' 
    }, 
    enabled: { 
     type: DataTypes.INTEGER(1), 
     allowNull: false, 
     defaultValue: '1' 
    }, 
    account_type_id: { 
     type: DataTypes.INTEGER(11), 
     allowNull: false 
    }, 
    billing_account_id: { 
     type: DataTypes.BIGINT, 
     allowNull: false, 
     references: { 
     model: 'account', 
     key: 'id' 
     } 
    }, 
    contact_name: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     defaultValue: '' 
    }, 
    contact_email: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     defaultValue: '' 
    }, 
    data_feeds_path: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     defaultValue: '' 
    }, 
    requests: { 
     type: DataTypes.BIGINT, 
     allowNull: false, 
     defaultValue: '0' 
    }, 
    true_impressions: { 
     type: DataTypes.BIGINT, 
     allowNull: false, 
     defaultValue: '0' 
    }, 
    clicks: { 
     type: DataTypes.BIGINT, 
     allowNull: false, 
     defaultValue: '0' 
    }, 
    actions: { 
     type: DataTypes.BIGINT, 
     allowNull: false, 
     defaultValue: '0' 
    }, 
    conversions: { 
     type: DataTypes.BIGINT, 
     allowNull: false, 
     defaultValue: '0' 
    }, 
    status_id: { 
     type: DataTypes.BIGINT, 
     allowNull: false, 
     defaultValue: '1', 
     references: { 
     model: 'status', 
     key: 'id' 
     } 
    }, 
    status_modified_date: { 
     type: DataTypes.DATE, 
     allowNull: false, 
     defaultValue: '0001-01-01 00:00:00' 
    }, 
    date_created: { 
     type: DataTypes.DATE, 
     allowNull: false, 
     defaultValue: '0001-01-01 00:00:00' 
    }, 
    date_created_user_id: { 
     type: DataTypes.BIGINT, 
     allowNull: false, 
     defaultValue: '1', 
     references: { 
     model: 'user', 
     key: 'id' 
     } 
    }, 
    date_modified: { 
     type: DataTypes.DATE, 
     allowNull: false, 
     defaultValue: '0001-01-01 00:00:00' 
    }, 
    date_modified_user_id: { 
     type: DataTypes.BIGINT, 
     allowNull: false, 
     defaultValue: '1', 
     references: { 
     model: 'user', 
     key: 'id' 
     } 
    }, 
    date_deleted: { 
     type: DataTypes.DATE, 
     allowNull: true 
    }, 
    date_deleted_user_id: { 
     type: DataTypes.BIGINT, 
     allowNull: true, 
     references: { 
     model: 'user', 
     key: 'id' 
     } 
    } 
    }, { 
    tableName: 'account' 
    }); 
}; 

如果我嘗試使用我的Sequelize查詢聯接,我得到:

Unhandled rejection Error: X is not associated to Y! 
    at Model.validateIncludedElement (/Library/WebServer/adstudio/node_modules/sequelize/lib/model.js:558:11) 
    at /Library/WebServer/adstudio/node_modules/sequelize/lib/model.js:440:29 
    at Array.map (native) 
    at Model.validateIncludedElements (/Library/WebServer/adstudio/node_modules/sequelize/lib/model.js:436:37) 
    at Model.aggregate (/Library/WebServer/adstudio/node_modules/sequelize/lib/model.js:1558:30) 
    at Model.<anonymous> (/Library/WebServer/adstudio/node_modules/sequelize/lib/model.js:1624:17) 
    at runCallback (timers.js:666:20) 
    at tryOnImmediate (timers.js:639:5) 

下面是我試圖使用從導入模型定義後加入協會的代碼我Sequelize自動文件:

 console.log("Length of models: " + Object.keys(instance.sequelize.models).length) 
     for (var objectName in instance.sequelize.models) { 
      var model = instance.sequelize.models[objectName]; 
      var columns = instance.sequelize.modelManager.getModel(model.name).attributes; 
      console.log('Processing foreign keys for ' + model.name); 
      for (var columnName in columns) { 
       var column = columns[columnName]; 
       if (column.references) { 
        //if (column.references.key == column.references.model + '_id') { 
        if (model.name == column.references.model) { 
         console.log(" " + model.name + ' has one ' + column.fieldName.replace("_id", "")); 
         model.belongsTo(model, { as: column.fieldName.replace("_id", ""), foreignKey: column.fieldName }); 
        } else { 
         //console.log(model.name + ' has one ' + column.references.model); 
         //console.log(column.references.model + ' has many ' + model.name); 

         // Will add foreignKey to the right-value table 
         //console.log(" " + model.name + " belongs to " + column.references.model + " on foreign key " + column.references.key); 
         //model.belongsTo(instance.sequelize.models[column.references.model], { foreignKey: column.references.key }); 

         console.log(" " + column.references.model + " belongs to " + model.name + " on foreign key " + column.fieldName); 
         instance.sequelize.models[column.references.model].belongsTo(model, { foreignKey: column.fieldName }); 

         console.log(model); 

         //model.hasOne(instance.sequelize.models[column.references.model]); 
         //instance.sequelize.models[column.references.model].hasMany(model); 
        } 
       } 
      } 
     } 

我已經試過幾乎所有組合和協會就是不正確定義,等於是說,account.id列是該賬號的外鍵_audit_log表。我已經嘗試了幾乎所有可能的變體,並且無法看到它可能發生的情況。

+0

你有沒有發現這種映射的任何解決方案? –

回答

0

不應該自我協會被定義爲

Person.hasOne(Person, {as: 'Father'}) 
// this will add the attribute FatherId to Person 

雖然我沒有用sequelize自動

相關問題