表1:TravelGuest
字段:IDNumber

表1:TravelOrder
字段:IDNumber

设置关联

TravelGuest.hasMany(TravelOrder, {foreignKey: 'IDNumber',sourceKey: 'IDNumber'});
TravelOrder.belongsTo(TravelGuest, {foreignKey: 'IDNumber',targetKey: 'IDNumber'});

说明:
– `hasMany`:默认拿**主表主键 (id)** 和子表`IDNumber`做关联,不是拿`TravelGuest.IDNumber`。**所以要加上 `sourceKey: ‘IDNumber’`**
– `belongsTo`:默认拿子表外键去匹配主表主键 (id),**所以要加上 `targetKey: ‘IDNumber’`**
– 没有指定`as`别名,Sequelize 自动生成别名为模型复数:`TravelOrders`

查询代码

const result = await TravelGuest.findAndCountAll({ 
      where: whereClause,
      limit: +pageSize,
      offset: offset,
      // 重点:distinct:true,count 统计 TravelGuest 客户数量,避免订单一对多导致计数错误
      distinct: true,
      include: [
        {  
          model: TravelOrder,
          required: false, // 因为没有设置关联,所以需要设置为可选的  
          where: {  
            IDNumber: Sequelize.literal('TravelGuest.IDNumber') // 使用字面量来引用外部查询的字段  
          },
        }
      ], 
});  
作者 铁血 汉子 3 天前
2026/09/17/08:04:37pm 2026/9/14/11:37:19
0 14