2017-02-05 155 views
1

我使用的是featherjs v2.0.3和sequelize v3.29.0,我剛剛創建了三個模型,第三個與另外兩個模型有關係。如何在feathersjs項目中使用sequelizejs創建外鍵

Tables

我用羽毛-CLI生成每個服務,然後編輯每個模型文件。

到目前爲止,這麼好,創建表(使用PostgreSQL),索引被創建,feathersjs很好地處理了CRUD,但沒有外鍵。

因此,當我試圖告訴羽毛之間的關係模型之間,我遇到了麻煩。

當我添加role_permission.belongsTo(permissions)role_permission模型,我得到這個錯誤: ReferenceError: permissions is not defined

正如我在Sequelize文檔中看到,該模型是相同的「文件」中定義的,因此我懷疑問題在那裏,但我不明白需要做什麼。

Feathersjs project structure

最後,這裏的permissionrole_permission模型定義的相關部分:

// permission-model.js - A sequelize model 

module.exports = function(sequelize) { 
    const permission = sequelize.define('permissions', { 
     permission_id: { 
      type: Sequelize.UUID, 
      defaultValue: Sequelize.UUIDV1, 
      primaryKey: true, 
      allowNull: false 
     }... 
    }, ...); 

    permission.sync(); 

    return permission; 
}; 

// role_permission-model.js - A sequelize model 

module.exports = function(sequelize) { 
    const role_permission = sequelize.define('role_permissions', { 
     permission_id: { 
      type: Sequelize.UUID, 
      allowNull: false 
     }... 
    }, ...); 

    role_permission.belongsTo(permissions) //<-- undefined? 

    role_permission.sync(); 

    return role_permission; 
}; 

你有任何指針幫我解決這個問題? 謝謝!

回答

2

您需要導入權限模型。但它可能會或可能不會被定義。

以下是我在github上從@mrpatiwi發現的一種方法,以確保在建立關聯之前加載每個模型。

首先,當您需要定義關係時,添加一個名爲associate的classMethod,它接受所有模型並設置關係。

module.exports = function(sequelize) { 
    const role_permission = sequelize.define('role_permisson', { 
    ... 
    }, { 
    classMethods: { 
     associate(models) { 
     role_permission.belongsTo(models.permission); 
     }, 
    }, 
    }); 

    // Don't add role_premission.sync() here 

    return role_permission; 
}; 

然後,在SRC /服務/在module.exports函數結束index.js,添加:

// Setup relationships 
const models = sequelize.models; 
Object.keys(models) 
    .map(name => models[name]) 
    .filter(model => model.associate) 
    .forEach(model => model.associate(models)); 

sequalize.sync(); 
+0

真棒人!精美的作品,非常感謝 – transistor

+0

謝謝@ sam-desota!我現在一直在尋找這樣的事情。有沒有關於你剛纔詳細描述的任何文件?這是超級有用的。這會爲我節省大量的時間。 – abraganza