Я пытаюсь настроить двусторонние отношения между многими, для многих и для многих. Существует таблица присоединиться, «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() завершается с ошибкой.