2017-02-28 9 views
1

私はそれらの間の関係を定義しようとしている3つのモデルを持っています。続編で関係を宣言していますか?

モデル: ユーザー 支払い 債務者

  • ユーザーが
  • お支払いは、ユーザーに属している多くの支払いを持っている
  • 支払いは
  • 債務者が属する支払へ
  • 債務者が属する多くの債務者を持っていますお支払いまで

ソースとターゲットでリレーションシップを定義する必要はありますか?すなわち

User.hasMany(Payment, {as: 'Payments'}) 

とも

Payment.belongsTo(User) 

または私はちょうど一つのモデルでそれを定義して逃げることができますか?

両方で定義しようとするとエラーが表示されます。私がインポートするモデルはundefinedなので、 "belongsTo()"や "hasMany()"関数に渡すとエラーが出るcalled with something that's not an instance of Sequelize.Model

私はそれを1つのモデルにしか含めることはできません関係を正しく理解する。

次のように私のモデルは以下のとおりです。

支払いモデル:

import { sequelize } from '../config'; 
import Sequelize from 'sequelize'; 
import User from './User'; 


const Payment = sequelize.define('payment', { 
    amount: { 
    type: Sequelize.FLOAT 
    }, 
    reference: { 
    type: Sequelize.STRING 
    }, 
    user_id: { 
    type: Sequelize.INTEGER 
    } 
}); 

Payment.belongsTo(User) 


export default Payment; 

Userモデル:

import { sequelize } from '../config'; 
import Sequelize from 'sequelize'; 
import Payment from './Payment'; 

const User = sequelize.define('user', { 
    email: { 
    type: Sequelize.STRING 
    }, 
    username: { 
    type: Sequelize.STRING 
    }, 
    firstName: { 
    type: Sequelize.STRING 
    }, 
    lastName: { 
    type: Sequelize.STRING 
    }, 
    facebookID: { 
    type: Sequelize.STRING 
    } 
}); 

User.hasMany(Payment, {as: 'Payments'}) 

export default User; 

// EDIT

私はAで新しいユーザーを作成しようとするとお支払い、エラーが発生しますpayment is not associated to user!

あなたは Payment(循環依存を)必要と userpaymentにあなたが Userモデルおよびその逆を必要とするため起こる
exports.create = (req, res) => { 

    User.create({ 
     email: '[email protected]', 
     firstName: "Test", 
     lastName: "Test", 
     username: 'fnord', 
     payment: [ 
     { amount: 10.00}, 
     ] 
    }, { 
     include: [ Payment ] 
    }) 
} 

答えて

1

、。このような状況を回避するためには、同じファイル内の両方のモデルを宣言しなければならないか、従うことができるSequelizeあなたがsequelize-cliモジュールを使用する必要があり、それを達成するために方法

module.exports = (sequelize, DataTypes) => { 

    return sequelize.define('modelName', { 
     // attributes 
    }, { 
     // additional options, like classMethods in which you could create the association 
     classMethods: { 
      associate: function(models) { 
       this.belongsTo(models.Model); 
       this.hasMany(models.Model); 
      } 
     } 
    }); 
} 

お勧めします。インストールする場合は、sequelize initコマンドを使用して、すべてのモデルを続行に登録するファイルを生成します(これらのモデルはすべて最初は1か所にありますが、自動生成ファイルを変更して変更できます)。

この場合、モデルごとに反復処理を行い、登録し(sequelize.import()メソッドを使用して)、モデル間の関係を作成するassociate関数を呼び出します。この方法はあなたが言及した状況を防ぐでしょう。

+0

「お支払いはユーザーに関連付けられていません!」と表示されます。私はsequelize-cliを使用してプロジェクトを開始しようとしました。しかし、後遺症は本当に必要ですか?私は実際にそれに付随するすべての余分なもの、つまりシーダーやマイグレーションなどを望んでいません。 – Stretch0

+0

この「支払いはユーザーに関連付けられていません」というエラーはどこで取得できますか?それを引き起こすコードの一部で質問を編集できますか?もちろん、 'sequelize-cli'については、必須ではありません。あなたはそれなしで続けることができますが、循環依存を覚えておいてください。さらに、後でデータベース表を変更するときに移行が必要になります。 – piotrbienias

+0

にエラーの原因となるコードが追加されました。私は支払いで新しいユーザーを作成しようとしていますが、関係が設定されていないと信じています。 – Stretch0