2017-02-05 3 views
0

2つのテーブルの間に1対多の関係を設定しようとしているシンプルなサンプルアプリケーションがあります。私はmssql(退屈な)とsequelizeを使用しています。私はデータベースを起動するときにテーブルを持っていません。私はデータベースに正常に接続し、データベースにモデルを作成/同期させてみます。1:mの問題(belongsToおよびhasManyを使用)。結果は提案されたモデルを反映していません

私はここに自分のコードを提供して、誰かが私が望む結果を得ることができない理由があるかどうかを確認しています。私はいくつかの人々がinstanceMethodsclassMethodsであり、アソシエートと呼ばれるオブジェクトをいくつか作成しているのを見ましたが、私はそのドキュメントについては何も見ていません。私はここで何が欠けていますか?私は自分のプロジェクトを照会するときに私のアイテムコレクションに値を設定したいだけです。アソシエーションを正しく設定していますか?

私はさらに次のようにbelongsToManyを使用すると考えましたが、それは私にとってはうまくいかなかったようです。

project.belongsToMany(workitem, {through: 'ProjectWorkItem', as: 'Items', foreignKey: 'workitemId'}); 
workitem.belongsToMany(project, {through: 'ProjectWorkItem', as: 'Projects', foreignKey: 'projectId'}); 

index.js

const Sequelize = require('sequelize'); 

var sequelize = new Sequelize('mssql://username:[email protected]:1433/sequelize-test') 

sequelize 
    .authenticate() 
    .then(function (err) { 
     const services = require('./models'); 
     services(sequelize); 
     console.log('Connection has been established successfully.'); 
    }) 
    .catch(function (err) { 
     console.log('Unable to connect to the database:', err); 
    }); 

モデルは

'use strict'; 
const WorkItem = require('./workitem-model'); 
const Project = require('./project-model'); 


module.exports = function (sequelize) { 

    console.log('Pre-configure start'); 
    const project = Project(sequelize); 
    const workitem = WorkItem(sequelize); 

    var projectInstance = project.build({ 
    title: 'very important project', 
    description: 'Some description' 
    }); 

    projectInstance 
    .save() 
    .then(function (savedProject) { 
     var itemInstance = workitem.build({ 
     text: "abc", 
     projectId: savedProject.id 
     }); 
     itemInstance 
     .save() 
     .then(function() { 
      project. 
      findById(savedProject.id) 
      .then(function (dbProject) { 

       console.log(dbProject.title); 
       // THIS RETURNS UNDEFINED - SHOULDN'T THERE BE DATA 
       console.log(dbProject.Items); // <------------- 
      }); 
     }); 
    }); 
}; 

モデルindex.js \ \

'use strict'; 

const Sequelize = require('sequelize'); 
const Project = require('./project-model'); 

module.exports = function (sequelize) { 
    const workitem = sequelize.define('workitems', { 
    text: { 
     type: Sequelize.STRING, 
     allowNull: false 
    } 
    }, { 
    freezeTableName: true 
    }); 

    const project = Project(sequelize); 
    workitem.belongsTo(project); 
    project.hasMany(workitem, { 
    as: 'Items' 
    }); 

    workitem.sync(); 

    return workitem; 
}; 
をworkitem.jsの

モデル\ project.js

'use strict'; 

const Sequelize = require('sequelize'); 

module.exports = function (sequelize) { 
    const project = sequelize.define('projects', { 
    title: { 
     type: Sequelize.STRING, 
     allowNull: false 
    }, 
    description: { 
     type: Sequelize.STRING, 
     allowNull: false 
    } 
    }, { 
    freezeTableName: true, 

    }); 

    project.sync(); 

    return project; 
}; 
+0

データが入っているデータベースをチェックしましたか? –

+0

うん、そこにデータがある。 Management StudioでSQL文を実行して、テーブルにデータがあることを確認しました。 – abraganza

+0

プロジェクトの前にconsole.log(savedProject.id)を実行します。 findById(savedProject.id)と正しいIDが渡されているかどうかをチェック –

答えて

0
'use strict'; 
const WorkItem = require('./workitem-model'); 
const Project = require('./project-model'); 

module.exports = function (sequelize) { 

    console.log('Pre-configure start'); 
    const project = Project(sequelize); 
    const workitem = WorkItem(sequelize); 

    var projectInstance = project.build({ 
    title: 'very important project', 
    description: 'Some description' 
    }); 

    return projectInstance 
    .save() 
    .then(function (savedProject) { 
     console.log(savedProject); // check values here. id might be in nested dataValues object e.g. savedProject.dataValues.id; 
     var itemInstance = workitem.build({ 
     text: "abc", 
     projectId: savedProject.id 
     }); 
     return itemInstance.save(); 
    }).then(function (myWorkItem) { 
     return project. 
     findById(myWorkItem.projectId); 
    }).then(function (dbProject) { 
     console.log(dbProject.title); 
     // THIS RETURNS UNDEFINED - SHOULDN'T THERE BE DATA 
     console.log(dbProject.Items); // <------------- 
     return dbProject; 
    }); 
}; 
+0

私の問題は私のモデル定義と関係のセットアップ方法にあると思います。私はそこに何が欠けているのか分かりません。 models \ index.jsの定義の後のコードは、* Project *の取得時にmy * Items *コレクションが作成されることを証明することに過ぎませんでした。 – abraganza

+0

また、提供されたコードを使用すると、次のエラーが発生します **未処理の拒否TypeError:未定義のプロパティ 'savedProject'を設定できません** – abraganza

+0

workItemテーブルにprojectId列がありますか? –

0

私はStackOverflowの上で同様のポストにはほとんど掘りでそれを考え出した:)場合には更新されたコードを投稿する他のいずれかが、似たような必要があります。興味深いのは、関係バインディングを行うメソッドをセットアップしてから、すべてのモデルがセットアップされた後に関連メソッドを呼び出すことでした。さらに、すべての相互関係のために、プロセスの終わりに中断しないで、後で同期をとる必要がありました。今は私には意味がありますが、理解するのは苦痛でした。

index.js

const Sequelize = require('sequelize'); 

var sequelize = new Sequelize('mssql://username:[email protected]:1433/sequelize-test') 

sequelize 
    .authenticate() 
    .then(function (err) { 
     const services = require('./models'); 
     services(sequelize); 
     console.log('Connection has been established successfully.'); 
    }) 
    .catch(function (err) { 
     console.log('Unable to connect to the database:', err); 
    }); 

モデル\作業項目-model.js

'use strict'; 

const Sequelize = require('sequelize'); 

module.exports = function (sequelize) { 
    const workitem = sequelize.define('workitems', { 
    text: { 
     type: Sequelize.STRING, 
     allowNull: false 
    } 
    }, { 
    classMethods: { 
     associate(models) { 
     workitem.belongsTo(models.projects); 
     } 
    }, 
    freezeTableName: true 
    }); 

    return workitem; 
}; 

モデル\プロジェクト-model.js

'use strict'; 

const Sequelize = require('sequelize'); 

module.exports = function (sequelize) { 
    const project = sequelize.define('projects', { 
    title: { 
     type: Sequelize.STRING, 
     allowNull: false 
    }, 
    description: { 
     type: Sequelize.STRING, 
     allowNull: false 
    } 
    }, { 
    classMethods: { 
     associate(models) { 
     project.hasMany(models.workitems, { 
      as: 'Items' 
     }); 
     } 
    }, 
    freezeTableName: true, 
    }); 

    return project; 
}; 

models \ index.js

'use strict'; 
const WorkItem = require('./workitem-model'); 
const Project = require('./project-model'); 

module.exports = function (sequelize) { 

    console.log('Pre-configure start'); 
    const project = Project(sequelize); 
    const workitem = WorkItem(sequelize); 

    // Setup relationships 
    const models = sequelize.models; 

    Object.keys(models) 
    .map(name => models[name]) 
    .filter(model => model.associate) 
    .forEach(model => model.associate(models)); 

    sequelize.sync(); 

    var projectInstance = project.build({ 
    title: 'very important project', 
    description: 'Some description' 
    }); 

    return projectInstance 
    .save() 
    .then(function (savedProject) { 

     var itemInstance = workitem.build({ 
     text: "abc", 
     projectId: savedProject.id 
     }); 
     return itemInstance.save(); 
    }).then(function (myWorkItem) { 
     return project. 
     findById(myWorkItem.projectId); 
    }).then(function (dbProject) { 

     dbProject.getItems().then(function (items) { 
     console.log(items); // <------- Associated Item data returned 
     }); 

     return dbProject; 
    }); 
}; 
関連する問題