2015-03-20 11 views
5

Хорошо, так у меня есть следующие три modelsSequelize hasMany через другую таблицу

Модуль:

var Module = sequelize.define('module', { 
     id: DataTypes.INTEGER, 
     name: DataTypes.STRING, 
     description: DataTypes.STRING, 
     category_id: DataTypes.STRING, 
     module_type_id: DataTypes.STRING, 
     gives_score: DataTypes.INTEGER, 
     duration: DataTypes.STRING, 
     price: DataTypes.STRING 

    }, { 
     freezeTableName: true} 
) 

Competence:

Competence = sequelize.define('competence', { 
     id: DataTypes.INTEGER, 
     name: DataTypes.STRING, 
     organization_id: DataTypes.INTEGER, 
     competence_type_id: DataTypes.INTEGER 
    },{freezeTableName:true}) 

Module_has_competence:

 Module_has_competence = sequelize.define('module_has_competence', { 
    id: DataTypes.INTEGER, 
    module_id: DataTypes.INTEGER, 
    competence_id: DataTypes.INTEGER, 
    score: DataTypes.STRING 
},{ 
    freezeTableName: true} 
}) 

Как вы можете видеть связь между таблицами являются n:m

Так что теперь я хочу, чтобы найти все Competence что Module имеет:

Так я создал следующее соотношение:

Module.hasMany(Competence, {through: Module_has_competence, foreignKey: 'module_id'}); 

Однако, когда я пытаюсь запустить:

retrieveById: function (quote_id, onSuccess, onError) { 
       Module.find({include: [{ all: true }],where: {id: quote_id}}) 
        .success(onSuccess).error(onError); 
      } 

ничего не возвращает. Но если я удалю отношения, то он возвращает только Module

Может ли кто-нибудь сказать мне, что я делаю неправильно?

Когда я отладки

Когда я отладки не записывает в журнал никаких SQL, к сожалению, это, кажется, он просто игнорирует вызов SQL?

+0

Вы можете разместить запросы SQL, полученные этими утверждениями? Кроме того, состояние вашего БД в этот момент было бы полезно –

+0

@ DanRocha Конечно, держитесь, пожалуйста: D –

+0

@DanRocha К сожалению, он не публикует никаких sql: s все мои другие функции, но этого нет: s –

ответ

4

С моей точки зрения, таблицы, созданные вами во многих отношениях, и что когда вы запрашиваете «Модуль», вы хотите, чтобы все связанные с ним «компетенции» были связаны.

Хотя я не был в состоянии получить .hasMany() работу, ошибка производства был:

Trace: [TypeError: Cannot call method 'replace' of undefined] 
    at null.<anonymous> (/Users/sjlu/Development/29165644/app.js:61:13) 
    at tryCatch1 (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/util.js:45:21) 
    at Promise._callHandler (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/promise.js:571:13) 
    at Promise._settlePromiseFromHandler (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/promise.js:581:18) 
    at Promise._settlePromiseAt (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/promise.js:713:18) 
    at Promise._settlePromiseAt (/Users/sjlu/Development/29165644/node_modules/sequelize/lib/promise.js:76:18) 
    at Promise._settlePromises (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/promise.js:854:14) 
    at Async._consumeFunctionBuffer (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/async.js:85:12) 
    at Async.consumeFunctionBuffer (/Users/sjlu/Development/29165644/node_modules/sequelize/node_modules/bluebird/js/main/async.js:40:14) 
    at process._tickCallback (node.js:442:13) 

В которой этот выход практически невозможно отлаживать.

Однако, я был в состоянии создать свои модели привязок и запросить его правильно с .belongsToMany() ассоциациями

Competence.belongsToMany(Module, { 
    through: Module_has_competence, 
    as: 'module', 
    foreignKey: 'module_id' 
}) 
Module.belongsToMany(Competence, { 
    through: Module_has_competence, 
    as: 'competence', 
    foreignKey: 'competence_id' 
}) 

который выдает запрос, который вы ищете

SELECT `module`.`id`, 
     `module`.`name`, 
     `module`.`description`, 
     `module`.`category_id`, 
     `module`.`module_type_id`, 
     `module`.`gives_score`, 
     `module`.`duration`, 
     `module`.`price`, 
     `module`.`createdat`, 
     `module`.`updatedat`, 
     `competence`.`id`         AS `competence.id`, 
     `competence`.`name`        AS `competence.name`, 
     `competence`.`organization_id`      AS 
     `competence.organization_id`, 
     `competence`.`competence_type_id`     AS 
     `competence.competence_type_id`, 
     `competence`.`createdat`       AS 
     `competence.createdAt`, 
     `competence`.`updatedat`       AS 
     `competence.updatedAt`, 
     `competence.module_has_competence`.`id`   AS 
     `competence.module_has_competence.id`, 
     `competence.module_has_competence`.`module_id`  AS 
     `competence.module_has_competence.module_id`, 
     `competence.module_has_competence`.`competence_id` AS 
     `competence.module_has_competence.competence_id`, 
     `competence.module_has_competence`.`score`   AS 
     `competence.module_has_competence.score`, 
     `competence.module_has_competence`.`createdat`  AS 
     `competence.module_has_competence.createdAt`, 
     `competence.module_has_competence`.`updatedat`  AS 
     `competence.module_has_competence.updatedAt` 
    FROM `module` AS `module` 
     LEFT OUTER JOIN (`module_has_competence` AS 
         `competence.module_has_competence` 
          INNER JOIN `competence` AS `competence` 
            ON `competence`.`id` = 
    `competence.module_has_competence`.`module_id`) 
    ON `module`.`id` = 
    `competence.module_has_competence`.`competence_id` 
    WHERE `module`.`id` = 1; 

В моем понимании .hasMany ссылается на отношение 1: M, которое не требует таблицы соединений.

http://docs.sequelizejs.com/en/latest/docs/associations/#one-to-many-associations

Вот суть того, как я к этому выводу:

https://gist.github.com/sjlu/fa5c2e0e267cd692418a

Смежные вопросы