我正在尝试在用户和学校这两个模型之间建立双向、多对多的关系。有一个连接表, 'user_school' 看起来像:
+------------+--------------+------+-----+---------+----------------+
| 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 字段来尝试让模型正常工作。现在这不是问题。但我仍然不确定定义这些字段的正确方法, Camel 或蛇形。)
我是这样定义关系的:
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() 调用失败。
最佳答案
事实证明,无论出于何种原因,我都需要在我的关系中添加“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 Hansen 在 freenode 上的 #sequelizejs 上提供的帮助。
关于mysql - sequelize 多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34883352/