使用Sequelize实现排序关联表有数据排在前面

在使用Sequelize进行关联查询时,如果想要将关联表数据为空的记录排在后面,可以使用required: false来定义一个非必要关联,并结合order方法实现自定义排序。

以下是一个实现这种排序的例子:

const { Model, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql' // 使用的数据库方言
});
 
// 假设有两个模型:Post和Comment
class Post extends Model {}
Post.init({
  // 初始化Post模型的属性
}, {
  sequelize,
  modelName: 'Post'
});
 
class Comment extends Model {}
Comment.init({
  // 初始化Comment模型的属性
}, {
  sequelize,
  modelName: 'Comment'
});
 
// 定义Post和Comment的关联关系
Post.hasMany(Comment, {
  foreignKey: 'postId',
  as: 'comments',
  required: false // 设置关联为非必要,即允许Post没有Comment
});
 
// 查询时,关联Comment但不要求一定有Comment记录,并按关联表Comment的记录数量降序排序
// 这样就可以将关联表为空的记录(Post)排在后面
const posts = await Post.findAll({
  include: [
    {
      model: Comment,
      as: 'comments',
      required: false
    }
  ],
  order: [
    // 使用sequelize.literal来构造自定义的SQL查询语句
    sequelize.literal('(SELECT COUNT(*) FROM `Comments` WHERE `Comments`.`postId` = `Post`.`id`) DESC'),
    // 如果还想在没有关联记录的情况下按照Post的其他字段排序,可以继续添加排序条件
    ['someOtherPostField', 'ASC'] // 假设someOtherPostField是Post表的另一个字段
  ],
  // 其他查询选项...
});

最重要的就是这个order里面的表字段 一定需要反引号  不然会报语法错误

解决了关联表有数据的排在最前面问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值