Javascript Sequelize.JS多对多findAll不使用联接表

Javascript Sequelize.JS多对多findAll不使用联接表,javascript,sequelize.js,Javascript,Sequelize.js,我有以下Sequelize设置: var sequelize = new Sequelize('...', '...', '...', { host: '...', port: '3306', logging: true, define: { timestamps: true, paranoid: true } }); var Period = sequelize.define('Period', { nam

我有以下Sequelize设置:

var sequelize = new Sequelize('...', '...', '...', {
    host: '...',
    port: '3306',

    logging:  true,

    define: {
        timestamps: true,
        paranoid: true
    }
});

var Period = sequelize.define('Period', {
    name: { type: Sequelize.STRING, allowNull: false },
    periodStart: { type: Sequelize.INTEGER },
    periodEnd: { type: Sequelize.INTEGER }
});

var Material = sequelize.define('Material', {
    name: { type: Sequelize.STRING, allowNull: false }
});

var Artefact = sequelize.define('Artefact', {
    accession: { type: Sequelize.STRING, allowNull: false },
    simpleName: { type: Sequelize.STRING },
    dimensions: { type: Sequelize.STRING },
    thumbnail: { type: Sequelize.TEXT },
    storageDescriptor: { type: Sequelize.TEXT },
    description: { type: Sequelize.TEXT }
});


Artefact.hasMany(Period);
Period.hasMany(Artefact);

Artefact.hasMany(Material);
Material.hasMany(Artefact);

Period.hasMany(Period, { as: 'children', foreignKey: 'parentId', useJunctionTable: false });
Period.belongsTo(Period, { as: 'parent', foreignKey: 'parentId' });

Material.hasMany(Material, { as: 'children', foreignKey: 'parentId', useJunctionTable: false });
Material.belongsTo(Material, { as: 'parent', foreignKey: 'parentId' });

sequelize.sync().success(function () 
{
    console.log('sync OK');

    Period.findAll({ include: [ Artefact ] }).success(function (periods)
    {
        console.log(JSON.stringify(periods, null, 4));
    });
}
).error(function (err)
{
    console.log('sync FAIL');
    throw err;
});
调用
sync()
会导致以下
CREATE
语句:

CREATE TABLE IF NOT EXISTS `Periods` (`name` VARCHAR(255) NOT NULL, `periodStart` INTEGER, `periodEnd` INTEGER, `id` INTEGER NOT NULL auto_increment , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `deletedAt` DATETIME, `parentId` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `Materials` (`name` VARCHAR(255) NOT NULL, `id` INTEGER NOT NULL auto_increment , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `deletedAt` DATETIME, `parentId` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `Artefacts` (`accession` VARCHAR(255) NOT NULL, `simpleName` VARCHAR(255), `dimensions` VARCHAR(255), `thumbnail` TEXT, `storageDescriptor` TEXT, `description` TEXT, `id` INTEGER NOT NULL auto_increment , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `deletedAt` DATETIME, `categoryId` INTEGER, `findLocationId` INTEGER, `storeLocationId` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `ArtefactsPeriods` (`PeriodId` INTEGER , `ArtefactId` INTEGER , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `deletedAt` DATETIME, PRIMARY KEY (`PeriodId`, `ArtefactId`)) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `ArtefactsMaterials` (`MaterialId` INTEGER , `ArtefactId` INTEGER , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, `deletedAt` DATETIME, PRIMARY KEY (`MaterialId`, `ArtefactId`)) ENGINE=InnoDB;
正如我所料。但是,调用
Period.findAll(…)
会导致以下SQL和异常:

Executing: SELECT `Periods`.*, `Artefacts`.`accession` AS `Artefacts.accession`, `Artefacts`.`simpleName` AS `Artefacts.simpleName`, `Artefacts`.`dimensions` AS `Artefacts.dimensions`, `Artefacts`.`thumbnail` AS `Artefacts.thumbnail`, `Artefacts`.`storageDescriptor` AS `Artefacts.storageDescriptor`, `Artefacts`.`description` AS `Artefacts.description`, `Artefacts`.`id` AS `Artefacts.id`, `Artefacts`.`createdAt` AS `Artefacts.createdAt`, `Artefacts`.`updatedAt` AS `Artefacts.updatedAt`, `Artefacts`.`deletedAt` AS `Artefacts.deletedAt`, `Artefacts`.`categoryId` AS `Artefacts.categoryId`, `Artefacts`.`findLocationId` AS `Artefacts.findLocationId`, `Artefacts`.`storeLocationId` AS `Artefacts.storeLocationId` FROM `Periods` LEFT OUTER JOIN `Artefacts` AS `Artefacts` ON `Periods`.`id` = `Artefacts`.`PeriodId`;

Error: ER_BAD_FIELD_ERROR: Unknown column 'Artefacts.PeriodId' in 'on clause'
    at Query.Sequence._packetToError (/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/protocol/sequences/Sequence.js:32:14)
    at Query.ErrorPacket (/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/protocol/sequences/Query.js:82:18)
    at Protocol._parsePacket (/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/protocol/Protocol.js:172:24)
    at Parser.write (/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/protocol/Parser.js:62:12)
    at Protocol.write (/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/protocol/Protocol.js:37:16)
    at Socket.ondata (stream.js:51:26)
    at Socket.EventEmitter.emit (events.js:117:20)
    at Socket.<anonymous> (_stream_readable.js:736:14)
    at Socket.EventEmitter.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:408:10)
    --------------------
    at Query.Sequence (/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/protocol/sequences/Sequence.js:15:20)
    at new Query (/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/protocol/sequences/Query.js:12:12)
    at Function.Connection.createQuery (/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/Connection.js:48:10)
    at Connection.query (/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/Connection.js:100:26)
    at module.exports.Query.run (/Users/ndjm8/Work/dev/sandbox/node_modules/sequelize/lib/dialects/mysql/query.js:26:17)
    at module.exports.execQueueItem (/Users/ndjm8/Work/dev/sandbox/node_modules/sequelize/lib/dialects/mysql/connector-manager.js:313:21)
    at /Users/ndjm8/Work/dev/sandbox/node_modules/sequelize/lib/dialects/mysql/connector-manager.js:269:25
    at adjustCallback (/Users/ndjm8/Work/dev/sandbox/node_modules/sequelize/node_modules/generic-pool/lib/generic-pool.js:187:7)
    at dispense (/Users/ndjm8/Work/dev/sandbox/node_modules/sequelize/node_modules/generic-pool/lib/generic-pool.js:211:9)
    at Object.me.acquire (/Users/ndjm8/Work/dev/sandbox/node_modules/sequelize/node_modules/generic-pool/lib/generic-pool.js:260:5)
执行:选择'Periods`.''artifacts`.'accession`作为'artifacts.accession`、'artifacts`.'simpleName`作为'artifacts.simpleName`、'artifacts`.'dimensions`作为'artifacts.dimensions`、'artifacts`.'thumbnail`作为'artifacts.thumnail`、'artifacts`.'storageDescriptor`作为'artifacts.storageDescriptor`,'Artefacts`.'description`为'Artefacts.description`、'Artefacts`.'id`为'Artefacts.id`、'Artefacts`.'createdAt`为'Artefacts.createdAt`、'Artefacts`.'updatedAt`为'Artefacts.updatedAt`、'Artefacts`.'categoryId`为'Artefacts.categoryId`,`Artefacts`.`findLocationId`作为`Artefacts.findLocationId`,`Artefacts`.`storeLocationId`作为`Artefacts.storeLocationId`从`Periods`左外连接`Artefacts`作为`Periods`上的`Artefacts`.`id`=`Artefacts`.`PeriodId`;
错误:ER_BAD_FIELD_错误:“on子句”中的未知列“artifacts.PeriodId”
在Query.Sequence._packetToError(/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/protocol/sequences/Sequence.js:32:14)
在Query.ErrorPacket(/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/protocol/sequences/Query.js:82:18)
at Protocol._parsePacket(/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/Protocol/Protocol.js:172:24)
在Parser.write(/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/protocol/Parser.js:62:12)
在Protocol.write(/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/Protocol/Protocol.js:37:16)
在Socket.ondata(stream.js:51:26)
位于Socket.EventEmitter.emit(events.js:117:20)
在插座上。(_stream_readable.js:736:14)
位于Socket.EventEmitter.emit(events.js:92:17)
在emitReadable上(_stream_readable.js:408:10)
--------------------
在Query.Sequence(/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/protocol/sequences/Sequence.js:15:20)
在新查询中(/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/protocol/sequences/Query.js:12:12)
在Function.Connection.createQuery(/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/Connection.js:48:10)
在Connection.query(/Users/ndjm8/Work/dev/sandbox/node_modules/mysql/lib/Connection.js:100:26)
在module.exports.Query.run(/Users/ndjm8/Work/dev/sandbox/node_modules/sequelize/lib/dialogs/mysql/Query.js:26:17)
位于module.exports.execQueueItem(/Users/ndjm8/Work/dev/sandbox/node_modules/sequelize/lib/dialogs/mysql/connector manager.js:313:21)
在/Users/ndjm8/Work/dev/sandbox/node_modules/sequelize/lib/dialogs/mysql/connector manager.js:269:25
在adjustCallback(/Users/ndjm8/Work/dev/sandbox/node_modules/sequelize/node_modules/generic pool/lib/generic pool.js:187:7)
分发时(/Users/ndjm8/Work/dev/sandbox/node_modules/sequelize/node_modules/generic pool/lib/generic pool.js:211:9)
在Object.me.acquire(/Users/ndjm8/Work/dev/sandbox/node_modules/sequelize/node_modules/generic pool/lib/generic pool.js:260:5)

它似乎没有尝试使用由于
sync()
而创建的
ArtefactsPeriods
表。我不知道我做错了什么。
Period
Material
的自参考关系都按预期运行,只是多对多的关系不起作用。

不过,经过一些挖掘,这是一个已知的问题,讨论内容如下: