【问题标题】:Sequelize: Include.where filtering by a 'parent' Model attributeSequelize:Include.where 按“父”模型属性过滤
【发布时间】:2015-05-05 11:54:52
【问题描述】:

我有两个模型相关,Catalog 和 ProductCategory。后者有一个组合的PK,'id,language_id'。 以下是简化的模型:

var Catalog = sequelize.define("Catalog", {
id: {
  type: DataTypes.INTEGER,
  primaryKey: true,
  autoIncrement: true
},
user_id: {
  type: DataTypes.INTEGER,
  allowNull: false
},
product_category_id: {
  type: DataTypes.STRING(7)
},
language_id: {
  type: DataTypes.INTEGER
},  
... more stuff ...
}

var ProductCategory = sequelize.define("ProductCategory", {
id: {
  type: DataTypes.STRING(7),
  primaryKey: true
},
language_id: {
  type: DataTypes.INTEGER,
  primaryKey: true
},
... more stuff ...
}

Catalog.belongsTo(models.ProductCategory, {foreignKey: 'product_category_id'});

我正在尝试包含与目录相关的 ProductCategory 表中的一些信息,但仅限于 language_id 匹配时。

目前,我正在从两个表中获取所有可能的匹配项。 这是现在的查询:

Catalog.find({where:
    {id: itemId},
    include: {
        model: models.ProductCategory, 
        where: {language_id: /* Catalog.language_id */}
    }
})

有没有办法使用目录中的属性来过滤两个模型具有相同语言的包含?

顺便说一句,我也尝试过更改 where 子句,但没有任何连续性:

where: {'ProductCategory.language_id': 'Catalog.language_id'}

【问题讨论】:

  • where: {'$ProductCategory.language_id$': 'Catalog.language_id'} 这可能也有用

标签: javascript sequelize.js


【解决方案1】:

Sequelize 为这种情况提供了一个额外的运算符 $col,因此您不必使用 sequelize.literal('...')(这更像是一种 hack)。

在您的示例中,用法如下所示:

Catalog.find({where:
    {id: itemId},
    include: {
        model: models.ProductCategory, 
        where: {
          language_id: {$col: 'Catalog.language_id'}
        }
    }
})

【讨论】:

  • 对其进行了测试,效果很好,感谢您对我的自我分析的改进。 ;)
  • 这只会为我返回 [Object object]
  • 记得包含 const Sequelize = require('sequelize'); const Op = Sequelize.Op;你可以 [Op.col] 而不是 $col 为我修复它
【解决方案2】:

你可以试试这个(特别是如果你使用 MariaDB)-

const Sequelize = require('sequelize'); 
const op = Sequelize.Op;

Catalog.find({where:
    {id: itemId},
    include: {
        model: models.ProductCategory, 
        where: {
          language_id: {[op.col]: 'Catalog.language_id'}
        }
    }
})

【讨论】:

    【解决方案3】:

    这似乎可以解决问题:

    where: {language_id: models.sequelize.literal('Catalog.language_id')}
    

    【讨论】:

    • 这在哪里起作用?使用sequelize.literal('Sale.debt') makes this weird thing: ``Payments.quantity = val = \'Sale.debt\'``
    • @dan_rocha:替换我最初发布的 Catalog.find 查询中的内部 where。如果您分享您正在尝试做的事情,我可能会为您提供帮助。输出确实很奇怪,但它确实有效。
    【解决方案4】:

    甚至可以试试这个:

    const models = require("models directory");
        {
           model: models.ModelName,
           where: {
                column-name: column-value
             }
        }
    

    【讨论】:

    • 这个想法是匹配一个属性,而不是一个特定的值。恐怕您的回答与手头的问题完全不符。
    猜你喜欢
    • 2019-08-23
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多