Sequelize Associate操作as操作符详解

Sequelize的as操作符在associate操作中体现在两个方面:

  1. 定义association时,可以使用as操作符设置别名和用途
  2. 执行query时,可以使用as操作符 “选择定义好的association”

此处需要特别注意的就是第2条。

假如不考虑associate操作,只看query语句的话,对于类似这种代码:

findAll中的as看起来很像是为Teacher起个别名,它会影响查询出的结果中,Teacher表中的字段名称。所以很自然地,当需要修改查询结果的字段名的时候,我们会期望通过修改as的值来达到目的。

当然它是会失败的,因为像刚才说的那样,query中的as是选择器而非重命名选项。下面我详细解释下:

表Student和表Teacher的关联关系可能并不唯一,即表Student中可能存在多个指向表Teacher的外键。

可以假设Student表中需要同时存储语文老师,英语老师等老师在Teacher表中的ID。则findAll操作中的include操作就有歧义了,因为它只知道要关联Teacher表查老师,但是并不知道你到底想要查的是语文老师还是英语老师,所以它也不知道应该使用哪个外键。此时就需要一个选项来表明,你想要查的是哪个老师。

对于这种情况,我们需要做两步操作

  1. 在association操作中,添加多条association操作。
  2. 在查询操作中,使用as选择定义好的association操作。

示例代码如下:

在这段代码中,我为Student表和Teacher表建立了两条association,一条是ChineseTeacher,一条是EnglishTeacher,分别代表刚才提到的语文老师和英语老师。在下面的findAll查询中,就可以使用 as: ‘ChineseTeacher’ 来查询语文老师,或者as: ‘EnglishTeacher’来查询英语老师。当然也可以include两次来同时查询语文老师和英语老师。


OK,道理都懂了,但是怎么实现简单的重命名呢?

因为as已经有了它的用途了,我们不能通过在query中as一个别名来动态地修改查询结果字段名了。所以,我们要用一个笨方法了。分两步:

  1. 定义一个association操作,在该association操作中,使用as指定我们想要的别名。此处需要注意的是:如果只是想简单地使用别名,需要使用foreignKey选项设置外键为原来的外键。不然sequelize会使用别名创建新的外键。
  2. 在query操作中,使用as选定步骤1中as设置的别名即可。

至此,as操作符在association中的应用讲解完毕啦。

谢谢阅读!