【发布时间】:2015-11-03 08:20:54
【问题描述】:
我有以下使用带有 Sequelize (@3.3.2) 的 node.js 的模型:
module.exports = function (sequelize, DataTypes) {
var Topic = sequelize.define("Topic", {
name: DataTypes.STRING,
}, {
classMethods: {
associate: function (models) {
Topic.hasMany(models.Section, {as: 'sections'});
}
}
});
return Topic;
};
module.exports = function (sequelize, DataTypes) {
var Section = sequelize.define("Section", {
previewImg: DataTypes.STRING,
description: {
type: DataTypes.TEXT,
allowNull: true
}
}, {
classMethods: {
associate: function (models) {
Section.belongsTo(models.Topic);
Section.belongsToMany(models.Domain, {through: 'SectionDomainsExclusive', as: 'exclusiveDomains'});
}
}
});
return Section;
};
module.exports = function (sequelize, DataTypes) {
var Domain = sequelize.define("Domain", {
name: {
type: DataTypes.STRING,
allowNull: false
}
});
return Domain;
};
所以一个主题有很多部分,一个部分可以有一个“专有”域列表。 所需的功能是:
如果没有独占域(无关系),则该域在所有这些域中都是可见的。如果分配了一个或多个专有域,则该部分应仅对这些域可见
现在我想检索主题以及可见的部分:
models.Topic.findAll({
include: [{
model: models.Section,
as: 'sections',
include: [{
model: models.Domain,
required: false,
as: 'exclusiveDomains',
}],
where: {
'exclusiveDomains.id': {
$or: {
$eq: 3,
$eq: null
}
}
}
}]
}).then(function (objList) {
///...
});
所以我想在别名为“exclusiveDomains”的域上进行 LEFT JOIN(必需:false),然后在 WHERE 中对未找到独占域 (NULL) 或该部分的结果进行整个查询对域 3 可见,这是我的域。
我不能将 WHERE 部分放入包含中,因为这只会限制加入的结果,并且我无法区分该部分是否没有独占域 listet 或者我的域 (3) 不在列表中.
不幸的是,Sequelize 总是放置“部分”。在我的 WHERE 前面,所以这会导致以下错误:
未处理的拒绝 SequelizeDatabaseError: SQLITE_ERROR: no such column:sections.exclusiveDomains.id
SQL-String 应该如下所示:
SELECT `Topic`.`id`,
`sections`.`id` AS
`sections.id`,
`sections.exclusiveDomains`.`id` AS
`sections.exclusiveDomains.id`,
`sections.exclusiveDomains.SectionDomainsExclusive`.`sectionid` AS
`sections.exclusiveDomains.SectionDomainsExclusive.SectionId`,
`sections.exclusiveDomains.SectionDomainsExclusive`.`domainid` AS
`sections.exclusiveDomains.SectionDomainsExclusive.DomainId`
FROM `topics` AS `Topic`
INNER JOIN `sections` AS `sections`
ON `Topic`.`id` = `sections`.`topicid`
INNER JOIN `sectionusergroup` AS `sections.usergroups.SectionUsergroup`
ON `sections`.`id` = `sections.usergroups.SectionUsergroup`.`sectionid`
LEFT OUTER JOIN `sectiondomainsexclusive` AS `sections.exclusiveDomains.SectionDomainsExclusive`
ON `sections`.`id` = `sections.exclusiveDomains.SectionDomainsExclusive`.`sectionid`
LEFT OUTER JOIN `domains` AS `sections.exclusiveDomains`
ON `sections.exclusiveDomains`.`id` = `sections.exclusiveDomains.SectionDomainsExclusive`.`domainid`
WHERE (`sections.exclusiveDomains`.`id` = 3 OR `sections.exclusiveDomains`.`id` IS NULL);
很遗憾,我无法获得sections.exclusiveDomains.id 部分,因为Sequelize 总是将部分放在前面,所以看起来像sections.exclusiveDomains.id,这显然是错误的。
我能做什么?
感谢您的支持!
【问题讨论】:
标签: javascript sql node.js include sequelize.js