【问题标题】:Sequels "where" referring to include model column续集“where”指包括模型列
【发布时间】: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


    【解决方案1】:

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

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

    可能有一种更简洁的方法来提取完全限定名称,但现在这似乎是一种享受!

    【讨论】:

    • 嗨,安东尼,非常感谢。我不知道这样的原始查询是可能的。这绝对比之后循环数组要好;)谢谢!
    • "已删除对 {where: 'raw query'} 的支持。", "已删除对 where 对象中的文字替换的支持。" ?
    猜你喜欢
    • 2020-04-15
    • 2019-03-02
    • 1970-01-01
    • 2015-03-26
    • 2017-08-24
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2013-05-27
    相关资源
    最近更新 更多