续集“哪里”指的是包括模特专栏

我有以下模型使用node.js与Sequelize(@ 3.3.2):

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; }; 

所以一个主题有很多部分,一个部分可以有一个“专属”域列表。 所需的function是:

如果没有专有域名(无关系),则域名在所有这些域名中都可见。 如果分配了一个或多个专用域,则该部分仅对这些域可见

现在我想要检索与可见部分一起的主题:

 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中查询没有find专有域的结果(NULL),或者存在该域对域可见3,这是我的领域。

我不能把WHERE部分放在include中,因为这样会限制连接的结果,而且我不能区分,如果这个部分没有专用的域,或者我的域(3)不在列表中。

不幸的是,Sequelize总是把“部分”。 我的在哪里,所以这导致了以下错误:

未处理的拒绝SequelizeDatabaseError:SQLITE_ERROR:no such column:sections.exclusiveDomains.id

SQLstring应该看起来像这样:

 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.exclusiveDomainsid部分,因为Sequelize总是把部分放在前面,所以看起来像sectionsexclusiveDomains.id ,这显然是错误的。

我能做什么?

感谢您的支持!

我发现原始查询是最好的方法。

 where:["sections.exclusiveDomains.id = 3 OR sections.exclusiveDomains.id is null", null] 

有可能是一个更清晰的方式来提取完全合格的名字,但现在这似乎工作的一种享受!