2016-01-19 4 views
1

Я пытаюсь настроить двусторонние отношения между многими, для многих и для многих. Существует таблица присоединиться, «user_school», который выглядит следующим образом:secelizejs many-to-many relationship

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | mediumint(9) | NO | PRI | NULL | auto_increment | 
| user_id | mediumint(9) | NO | MUL | NULL |    | 
| school_id | mediumint(9) | NO |  | NULL |    | 
| created_at | datetime  | YES |  | NULL |    | 
| updated_at | datetime  | YES |  | NULL |    | 
| updatedat | datetime  | YES |  | NULL |    | 
| createdat | datetime  | YES |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

(я создал различные createdAt и updatedAt поля, чтобы попытаться получить модель работает должным образом, что это не проблема сейчас, но я до сих пор.. не уверен, что правильный способ определения тех полей, верблюд или змеи случая)

Вот как я определил отношение:.

School.belongsToMany(User, { through: 'user_school', foreignKey: 'school_id'}); 
User.belongsToMany(School, { through: 'user_school', foreignKey: 'user_id'}); 

Второе соотношение работает. Я могу позвонить, user.getSchools() и получить школы, связанные с пользователем. Но первые отношения не работают. когда я звоню, school.getUsers(), я получаю сообщение об ошибке, как это:

Executing (default): SELECT `id`, `email`, `name`, `description`, `address1`, `address2`, `city`, `state`, `zip`, `url`, `phone`, `deleted`, `approved`, `added_by` AS `addedBy`, `sub_count` AS `subCount`, `created_at` AS `createdAt`, `updated_at` AS `updatedAt` FROM `school` AS `school` WHERE `school`.`id` = '0'; 

Unhandled rejection TypeError: Cannot read property 'replace' of undefined 
    at Object.module.exports.removeTicks (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/lib/utils.js:345:13) 
    at Object.module.exports.addTicks (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/lib/utils.js:341:29) 
    at Object.QueryGenerator.quoteIdentifier (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/lib/dialects/mysql/query-generator.js:300:18) 
    at Object.QueryGenerator.joinIncludeQuery (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1647:66) 
    at generateJoinQueries (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1373:38) 
    at Object.<anonymous> (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1411:27) 
    at Array.forEach (native) 
    at Object.QueryGenerator.selectQuery (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1410:10) 
    at QueryInterface.select (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/lib/query-interface.js:657:25) 
    at null.<anonymous> (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/lib/model.js:1377:32) 
    at bound (domain.js:280:14) 
    at runBound (domain.js:293:12) 
    at tryCatcher (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/node_modules/bluebird/js/release/util.js:11:23) 
    at Promise._settlePromiseFromHandler (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:489:31) 
    at Promise._settlePromise (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:546:18) 
    at Promise._settlePromise0 (/Users/andrunix/code/learning/hapi-sequelize/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:591:10) 

При запуске SQL, показанный выше, запрос работает правильно. Так что эта часть логики, похоже, работает.

Если я в обратном порядке определены отношения, например, так:

User.belongsToMany(School, { through: 'user_school', foreignKey: 'user_id'}); 
School.belongsToMany(User, { through: 'user_school', foreignKey: 'school_id'}); 

это вызывает «обрыв», чтобы произойти на другие отношения. Выполняется вызов school.getUsers(), а вызов user.getSchools() завершается с ошибкой.

ответ

3

Оказывается, по какой-то причине мне нужно было добавить «otherKey» в мои отношения. Вот что работал:

User.belongsToMany(School, { through: 'user_school', foreignKey: 'user_id', otherKey: 'school_id'}); 
School.belongsToMany(User, { through: 'user_school', foreignKey: 'school_id', otherKey: 'user_id'}); 

Благодаря Mick Хансена на #sequelizejs на Freenode за помощь.