mysql - sequelize 多对多关系

标签 mysql sequelize.js

我正在尝试在用户和学校这两个模型之间建立双向、多对多的关系。有一个连接表, '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/

相关文章:

javascript - Sequelize/postgres : Get records matching a value inside an array of object with a provided value

jquery - Sequelize 关联 On 或 ON

mysql - Mac 修改mysql密码失败

mysql - 通过CMD导入SQL数据库

php - 如何使用php将数据数组插入mysql

sql - 将 PostgreSQL 子查询语句转换为 Sequelize 查询

javascript - 使用 claudia-api-builder 时如何返回 API 响应?

mysql - 优化MySQL查询嵌套不存在可能吗?

php - 更改 WordPress 中的 URL : Absolute links

node.js - Sequelize - 一对多 - 一对多