开发者社区 问答 正文

sequelize联表查询如何通过JSON列某个属性排序?

下面代码中应该怎么样通过Task表time进行排序, 下面的查询应该怎么写?

const { Sequelize, Model, DataTypes } = require('sequelize');
const sequelize = new Sequelize({
  dialect: 'mysql', // support: mysql, mariadb, postgres, mssql
  database: 'test',
  host: 'localhost',
 	port: 3306,
  username: 'username',
  password: 'password',
  sync: { alter: true }
});

class Task extends Model {}
Task.init({
    title: Sequelize.STRING,
    data: Sequelize.JSON,
    uid: {
      type:Sequelize.STRING,
      primaryKey: true,
    }
  }, { sequelize, modelName: 'task_test' }
);
class User extends Model {}
User.init({
    username: Sequelize.STRING,
    uid: {
      type:Sequelize.STRING,
      primaryKey: true,
    }
  }, { sequelize, modelName: 'user_test' }
);

Task.sync({ alter: true })
User.sync({ alter: true })


User.hasMany(Task,{ foreignKey: 'uid', targetKey: 'uid' }); // 将uid添加到Task模型
Task.belongsTo(User, { foreignKey: 'uid', targetKey: 'uid' }); // 同样会将uid添加到Task模型中

// 假设Task的数据结构是
// {
//   title: 'test',
//   uid: '1'
//   data: { time: '1583265819366' }
// }

// 创建测试数据
 User.create({ username: 'jack', uid: '1'})
 User.create({ username: 'rose', uid: '2'})
 Task.create({ title: 'a', uid: '2', data: { time: '1583265819366' }})
 Task.create({ title: 'b',uid: '1', data: { time: '1583265819399' }})

// 应该怎么样通过Task表time进行排序, 下面的查询应该怎么写?
User.findAll({
  where: {
  },
  include: [Task],
  order: []
}).then((items) => {
  console.log(items)
})


展开
收起
shing952 2020-09-11 13:08:32 876 分享
分享
版权
举报
阿里云 AI 助理回答

要在查询中通过Task表的time字段进行排序,您需要在order选项中指定排序依据。由于time字段位于关联的Task模型内,您需要使用模型属性的路径来指定排序键。这里是修改后的代码示例:

User.findAll({
  where: {},
  include: [
    {
      model: Task,
      as: 'Tasks', // 假设关联时指定了别名,这里根据实际情况调整
      required: false, // 可选:设置为false表示即使没有关联的Task记录也返回User记录
      order: [[{ model: Task, as: 'Tasks' }, 'data->time', 'DESC']] // 这里假设data.time是JSON格式的时间戳
    }
  ],
  order: [] // 如果不需要对User本身排序,可以留空或者移除此行
}).then((items) => {
  console.log(items)
})

这段代码中,order数组内的第一个元素是一个数组,它指定了排序的详细信息。[{ model: Task, as: 'Tasks' }, 'data->time', 'DESC']这一部分说明了按照Task模型(通过别名Tasks)中的data->time(这是JSON字段中时间戳的路径,假设time是以JSON形式存储的)字段进行降序排序(DESC)。如果您的time字段不是JSON格式或路径不同,请相应地调整这部分路径。

请注意,这个查询语法依赖于Sequelize支持的JSON列操作和排序功能,具体可用性可能与数据库类型(如MySQL、PostgreSQL等)及其版本有关。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答