2017-02-05 17 views
0

У меня есть простая примерка приложения, где я пытаюсь установить соотношение между 1 и многими из двух таблиц. Я использую sequelize с mssql (утомительно). Когда я начинаю, у меня нет таблиц в базе данных. Я успешно подключаюсь к базе данных, а затем пытаюсь создать/синхронизировать модели с базой данных.Проблема с 1: м (с использованием ownTo и hasMany). Результат не отражает предлагаемую модель

Я предоставил свой код здесь, чтобы узнать, есть ли у кого-нибудь идеи, почему я не могу получить желаемый результат. Я видел, что некоторые люди instanceMethods и classMethods и создать некоторый объект с именем ассоциированный, но я ничего не вижу в документации об этом. Что мне здесь не хватает? Я просто хочу, чтобы мои элементы были заполнены при запросе моего проекта. Правильно ли я устанавливаю связь?

Я даже рассматривал использование принадлежитToMany следующим образом, но он, похоже, не работает для меня.

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); 
    }); 

модели \ 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); 

    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); // <------------- 
      }); 
     }); 
    }); 
}; 

модели \ workitem.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; 
}; 

модели \ 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

Да, там есть данные. Я выполнил инструкции SQL в Management Studio, чтобы убедиться, что в таблицах есть данные. – abraganza

+0

do console.log (savedProject.id) перед проектом. findById (savedProject.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

Я думаю, что моя проблема связана с моими определениями модели и в том, как устанавливаются отношения. Я просто не уверен, чего там не хватает. Код в моделях \ index.js после определения должен был просто доказать, что моя коллекция * Items * будет заполнена при извлечении * Project *. – abraganza

+0

Также, когда я использую предоставленный код, я получаю следующую ошибку: ** Необработанное отклонение TypeError: Не удается установить свойство «сохраненный проект» неопределенного ** – abraganza

+0

у вас есть столбец projectId в таблице workItem? –

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); 
    }); 

модели \ WorkItem-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; 
}; 

модели \ 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; 
    }); 
};