【问题标题】:Querying over multiple tables with Sequelize使用 Sequelize 查询多个表
【发布时间】:2021-08-31 19:47:13
【问题描述】:

在我的代码中,我有多个 Sequelize(使用 MySQL 作为数据库驱动程序)模型,例如 CarBikeElectronicPart,它们都有一个 name 字段。现在,我正在尝试根据它们的名称为所有这些模型提供搜索栏功能。
例如搜索汽车:

Car.findAll({ where: { name: '%search_query%' } })

有没有办法同时为多个模型执行此操作,而不必为每个模型并行运行查询或生成某种主表?

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    这些模型没有相互关联,对吧? Afaik 你不能在同一个 findAll 方法中查询多个模型。您需要为它编写自己的 SQL 查询:

    const { QueryTypes } = require('sequelize')
    
    const results = await sequelize.query('SELECT * FROM Car WHERE name LIKE :search UNION SELECT * FROM Bike WHERE name LIKE :search ... (Other models)',
      { 
        replacements: {search: req.query.search}, 
        type: QueryTypes.SELECT 
      }
    )
    

    SQL sytnax 可能不正确,因为我不经常使用它,但理论上您应该能够查询所需的所有表并使用 UNION 将它们连接到一个结果中。

    【讨论】:

    • 这行得通,不过 * 需要用列名替换。我还使用了 UNION ALL 而不是普通的 UNION,因为可能存在重复的字段。我的解决方案如下所示:SELECT id, name, "car" AS "type" FROM cars WHERE name LIKE :search UNION ALL SELECT id, name, "bike" AS "type" FROM bikes WHERE name LIKE :search...
    • 太好了,不知道你是否想要重复,所以我把它保留为默认值,不知道 * 的东西,以为应该得到所有列。
    猜你喜欢
    • 2015-10-14
    • 2019-01-27
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多