2017-02-28 52 views
1

我有三個模型,我試圖定義它們之間的關係。在續集中聲明關係?

型號: 用戶 付款 債務人

  • 用戶有許多付款
  • 付款屬於用戶
  • 付款有許多債務人
  • 債務人屬於支付
  • 債務人屬於付款

我需要在源和目標中定義關係嗎?即

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

Payment.belongsTo(User) 

或者我可以只用其定義在一個模型中脫身?

我試圖在兩者中定義它時都會出現錯誤。我導入的模型是undefined,因此當我嘗試將它傳遞到「belongsTo()」或「hasMany()」函數時,出現錯誤called with something that's not an instance of Sequelize.Model

當我只將它包含在一個模型中時,關係正確。

我的型號如下:

付款模式:

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; 

用戶模式:

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; 

//編輯

當我嘗試創建一個新用戶付款,我得到錯誤payment is not associated to user!

exports.create = (req, res) => { 

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

回答

1

這是因爲在payment您需要User模型,反之亦然,在user您需要Payment(循環依賴)。爲了避免這種情況,你就必須在同一個文件中的模型申報或者你可以按照Sequelize方式

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-cli模塊。如果你安裝了它,你可以使用sequelize init命令,該命令會生成一個文件,將所有模型註冊到序列化中(所有這些模型最初都在一個位置,但是可以通過修改自動生成的文件來更改它)。

在這種情況下,sequelize迭代遍歷每個模型,註冊它(使用方法sequelize.import()),並調用創建模型之間關係的associate函數。這樣可以防止你提到的情況。

+0

我仍然收到「付款不與用戶關聯!」。我嘗試過使用sequelize-cli並啓動項目。但是sequelize-cli真的需要嗎?我並不想要所有附帶的東西,例如播種機和遷移等。 – Stretch0

+0

你從哪裏得到這種「支付與用戶錯誤沒有關聯?你能用導致它的部分代碼編輯問題嗎?如果涉及'sequelize-cli'當然不是必需的 - 你可以繼續下去 - 但要記住循環依賴。更重要的是,在更改數據庫表時,您稍後需要遷移。 – piotrbienias

+0

已添加導致錯誤的代碼。我試圖創建一個新的用戶付款,但我相信沒有關係設置,所以它不會讓我。 – Stretch0