2017-02-07 16 views
11

sequelizeを使用して次の関連付けを作成しようとしていますが、次のエラーが表示されます。私はドキュメンテーションで見つけたものに応じて双方向の関連性を持っています。私はデータベーステーブルを調べるときに外来キーを見ることができるので、問題の原因を混乱させる。この例では、特定の注文に関連付けられた注文と顧客を引き出そうとしています。技術的には、3つのseaprate db pullを実行できますが、これは結合とは対照的に非効率的です。Sequelize:エラー:エラー:Table1はTable2に関連付けられていません

'use strict'; 

module.exports = function(sequelize, DataTypes) { 
    var user = sequelize.define('user', { 
    username: DataTypes.STRING(30), //remove 
    password: DataTypes.STRING(255), 
    emailaddress: DataTypes.STRING(255), 
    firstname: DataTypes.STRING(30), 
    middlename: DataTypes.STRING(30), //remove 
    lastname: DataTypes.STRING(30), 
    approve: DataTypes.BOOLEAN, 
    roles: DataTypes.STRING(50), 
    isactive: DataTypes.BOOLEAN 
    }, { 
    classMethods: { 
     associate: function(models) { 
     // associations can be defined here 
     this.hasMany(models.order); 
     } 
    } 
    }); 

    user.hook('afterCreate', function(usr, options) { 
     //hash the password 

     return user.update({ password: passwd }, { 
     where: { 
      id: usr.id 
     } 
     }); 
    }); 

    return user; 
}; 



'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var order = sequelize.define('order', { 
    ponumber: DataTypes.STRING(30), //remove 
    orderdate: DataTypes.DATE, 
    shippingmethod: DataTypes.STRING(30), 
    shippingterms: DataTypes.STRING(30), 
    deliverydate: DataTypes.DATE, 
    paymentterms: DataTypes.STRING(30), 
    overridediscount: DataTypes.BOOLEAN, 
    shippingaddress: DataTypes.STRING(30), 
    shippingcity: DataTypes.STRING(30), 
    shippingstate: DataTypes.STRING(20), 
    shippingzipcode: DataTypes.STRING(10), 
    isactive: DataTypes.BOOLEAN 
    }, { 
     associate: function(models) { 
     // associations can be defined here 
     this.belongsTo(models.user); 
     this.belongsTo(models.customer); 
     } 
    }); 

    order.hook('afterCreate', function(ord, options) { 
     //generate po number 

     return order.update({ ponumber: ponumbr }, { 
     where: { 
      id: ord.id 
     }//, 
     //transaction: options.transaction 
     }); 
    }); 

    return order; 
}; 


'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var customer = sequelize.define('customer', { 
    customernumber: DataTypes.STRING(30), //remove 
    customerspecificationid: DataTypes.INTEGER, 
    customertypeid: DataTypes.INTEGER, 
    sportid: DataTypes.INTEGER, 
    customername: DataTypes.STRING(20), //remove 
    address: DataTypes.STRING(30), 
    city: DataTypes.STRING(30), 
    state: DataTypes.STRING(30), 
    zipcode: DataTypes.STRING(30), 
    ordercomplete: DataTypes.BOOLEAN, 
    isactive: DataTypes.BOOLEAN 
    }, { 
     associate: function(models) { 
      // associations can be defined here 
     this.hasMany(models.order); 
     } 
    }); 

    customer.hook('afterCreate', function(cust, options) { 
     //generate the customer number 

     return customer.update({ customernumber: custnumber }, { 
     where: { 
      id: cust.id 
     } 
     }); 
    }); 

    return customer; 
}; 


Here is the constructor and method inside of a repository class I want to join 

constructor(model){ 
    super(model.order); 
    this.currentmodel = model; 
} 


findById(id){ 
    let that = this; 
    return new Promise(
     function(resolve, reject) { 
      that.model.find({ 
       where: { id: id }, 
       include: [ that.currentmodel.customer, that.currentmodel.user ] 
      }) 
      .then(function(order){ 
       resolve(order); 
      }) 
      .catch(function(err){ 
       reject(err); 
      }) 
    }); 
} 

私はドキュメンテーションを見直し、インターネットでこの問題の修正を探していましたが、私は答えを見つけることができません。誰かが私が行方不明になる可能性のあることについていくつかの光を当ててくださいでしたか?

上記の例では、主キーを使用して注文レコードに関連付けられたユーザーと顧客を取得しようとしています。私が今までに見つけたfindByのシナリオはすべて、顧客とユーザーに結びついた注文のリストを得ることになります。この注文に外部キーが関連付けられている注文と顧客を検索するには、何を変更する必要がありますか?

答えて

3

おそらくあなたの関連付けをどのように設定しているのでしょうか、親切に戦略を言及してください。

あなたは特急index.jsファイルのセットアップを使用して、//あなたが入れ

var fs  = require('fs') 
    , path  = require('path') 
    , Sequelize = require('sequelize') 
    , lodash = require('lodash') 
    , sequelize = new Sequelize('sequelize_test', 'root', 'root') 
    , db  = {} 

    fs.readdirSync(__dirname) 
    .filter(function(file) { 
     return (file.indexOf('.') !== 0) && (file !== 'index.js') 
    }) 
    .forEach(function(file) { 
     var model = sequelize.import(path.join(__dirname, file)) 
     db[model.name] = model 
    }) 

    Object.keys(db).forEach(function(modelName) { 
    if (db[modelName].options.hasOwnProperty('associate')) { 
     db[modelName].options.associate(db) 
    } 
    }) 
    // sequelize.sync({force: true}) 
    module.exports = lodash.extend({ 
    sequelize: sequelize, 
    Sequelize: Sequelize 
    }, db) 

ルートを関連付けるものindex.jsファイルをhttp://docs.sequelizejs.com/en/1.7.0/articles/express/

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var customer = sequelize.define('customer', { 
    customernumber: DataTypes.STRING(30), //remove 
    customerspecificationid: DataTypes.INTEGER, 
    customertypeid: DataTypes.INTEGER, 
    sportid: DataTypes.INTEGER, 
    customername: DataTypes.STRING(20), //remove 
    address: DataTypes.STRING(30), 
    city: DataTypes.STRING(30), 
    state: DataTypes.STRING(30), 
    zipcode: DataTypes.STRING(30), 
    ordercomplete: DataTypes.BOOLEAN, 
    isactive: DataTypes.BOOLEAN 
    }, { 
     associate: function(models) { 
      // associations can be defined here 
     models.customer.hasMany(models.order); 
     } 
    }); 

    customer.hook('afterCreate', function(cust, options) { 
     //generate the customer number 

     return customer.update({ customernumber: custnumber }, { 
     where: { 
      id: cust.id 
     } 
     }); 
    }); 

    return customer; 
}; 


'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var order = sequelize.define('order', { 
    ponumber: DataTypes.STRING(30), //remove 
    orderdate: DataTypes.DATE, 
    shippingmethod: DataTypes.STRING(30), 
    shippingterms: DataTypes.STRING(30), 
    deliverydate: DataTypes.DATE, 
    paymentterms: DataTypes.STRING(30), 
    overridediscount: DataTypes.BOOLEAN, 
    shippingaddress: DataTypes.STRING(30), 
    shippingcity: DataTypes.STRING(30), 
    shippingstate: DataTypes.STRING(20), 
    shippingzipcode: DataTypes.STRING(10), 
    isactive: DataTypes.BOOLEAN 
    }, { 
     associate: function(models) { 
     // associations can be defined here 
     models.order.belongsTo(models.user); 
     models.order.belongsTo(models.customer); 
     } 
    }); 

    order.hook('afterCreate', function(ord, options) { 
     //generate po number 

     return order.update({ ponumber: ponumbr }, { 
     where: { 
      id: ord.id 
     }//, 
     //transaction: options.transaction 
     }); 
    }); 

    return order; 
}; 

'use strict'; 

module.exports = function(sequelize, DataTypes) { 
    var user = sequelize.define('user', { 
    username: DataTypes.STRING(30), //remove 
    password: DataTypes.STRING(255), 
    emailaddress: DataTypes.STRING(255), 
    firstname: DataTypes.STRING(30), 
    middlename: DataTypes.STRING(30), //remove 
    lastname: DataTypes.STRING(30), 
    approve: DataTypes.BOOLEAN, 
    roles: DataTypes.STRING(50), 
    isactive: DataTypes.BOOLEAN 
    }, { 
    classMethods: { 
     associate: function(models) { 
     // associations can be defined here 
     models.user.hasMany(models.order); 
     } 
    } 
    }); 

    user.hook('afterCreate', function(usr, options) { 
     //hash the password 

     return user.update({ password: passwd }, { 
     where: { 
      id: usr.id 
     } 
     }); 
    }); 

    return user; 
}; 

を問い合わせる場合は、以下が正常に動作しています上記のdbコードをdbフォルダ内の各ファイルに置くか、名前を付けたい名前を付けてからクエリを使用できます。

var db = require( './db');

db.order.find({ 
      where: { id: 0 }, 
      include: [ db.customer, db.user ] 
     }) 
     .then(function(order){ 
      console.log(order) 
     }) 
+0

それでした。感謝万円。あなたが気にしないなら、もう1つの質問。これまでは、 '... id ='のようなレコードを作成または更新する前に、プロパティを設定して外部キーを追加していました。これを行うための好ましい方法はありますか、またはこのアプローチは受け入れられますか? – user1790300

+0

私はあなたの質問をはっきりと聞きましたが、モデルのidをすでに持っていれば関連付けることができ、idを使ってレコードを作成して、1対1や1対1のような単純な関連付けを行うことができます –

関連する問題