如何在没有关系的情况下通过Sequelize加入表

时间:2018-12-22 21:47:57

标签: sql typescript join sequelize.js

我创建了一个SQL命令行来选择我想要的数据,但找不到用Sequelize进行处理的方法。

我有两个桌子。一个带有一些ID链接到名称,另一个带有长文本。 我想从名称的ID中选择所有包含名称的文本。

此SQL命令正在运行:

SELECT 
    texts.id,
    texts.content
FROM
    text
    INNER JOIN users AS u ON u.id=38
WHERE
    LOWER(texts.content) like concat('%',u.name,'%')

当我尝试使用Sequelize进行操作时,我会遇到类似这样的事情:

this.modelTexts.findAll({
    include: [
        {
            model: this.modelUsers,
            where: { id: 38 },
        }
    ],
    where: ...
})

尝试此操作时,出现以下错误消息:

  

SequelizeEagerLoadingError:用户未与文本关联!

我知道我必须做出类似的事情:

Users.hasMany(Texts)

但是我找不到方法。

感谢您抽出宝贵的时间来处理此请求!

2 个答案:

答案 0 :(得分:0)

您可以为此使用Sequelize Raw,因此您的查询可以是这样的

sequelize.query(`
  SELECT 
    texts.id,
    texts.content
  FROM
    text
  INNER JOIN users AS u ON u.id=38
    WHERE
  LOWER(texts.content) like concat('%',u.name,'%')`
{ type: sequelize.QueryTypes.SELECT});

或者您可以添加关联。因此,无论您在代码中定义模型的何处,都应添加以下代码

User.hasMany('Text', {foreignKey: 'user_id'});

答案 1 :(得分:0)

虽然以上答案很不错,但我认为这可能会破坏使用续集的全部目的。您是否尝试过以下方法:

  • 在您的文本模型定义中:

    df.B.update(df[df.A!='endDate']['B'] // 1000)

  • 在用户模型定义中:

    Text.associate = models => { Text.belongsTo(models.User) }

让我知道您是否仍然遇到麻烦!从长远来看,了解序列化的工作原理将为您节省许多时间! :)