【问题标题】:Limit for included records in Loopback4Loopback4 中包含记录的限制
【发布时间】:2021-03-21 00:25:01
【问题描述】:

我想查询运动模型对象并包含相关对象(关系:athletExerciseLogsExercise)。但我只需要 1 个相关对象,这就是为什么我将“限制:1”添加到包含范围:

exerciseController.find({
    include: [{
        relation: "athletExerciseLogsExercise",
        scope: {
            where: {
                userId: id
            },
            order: ['date DESC'],
            limit: 1
        }
    }, ]
});

型号

export class Exercise extends Entity {
  ...
  @hasMany(() => AthletExerciseLog, {keyTo: 'exerciseId'})
  athletExerciseLogsExercise?: AthletExerciseLog[];
  ...
}

SQL(来自调试)

SELECT
  "id",
  "userid",
  "exerciseid",
  "date"
  ...
FROM
  "public"."athletexerciselog"
WHERE
  "userid" = '65b9b7110230'
  AND "exerciseid" IN (
    'd67503d511bb',
    '46d156a58aee'
  )
ORDER BY  "date" DESC
LIMIT 1

问题:SQL 结果只包含 1 条记录 for one "exerciseid" = 'd67503d511bb'

问题:如何从“athletexerciselog”为每个“exerciseid”接收1条记录?

【问题讨论】:

    标签: strongloop loopback loopback4


    【解决方案1】:

    我找到了以下解决方案,这可能是开销,但我找不到其他方法...

    1 - 创建数据库视图:为每个 useridexerciseid

    仅选择 1 个(最后一个)记录
    CREATE VIEW "v_athletexerciselog" AS  
      SELECT q.*
      FROM athletexerciselog q
      WHERE (
            q.id IN ( 
              SELECT max(i.id) AS max
               FROM athletexerciselog i
              WHERE (i.event IS NULL)
              GROUP BY i.userid, i.exerciseid
            )
      )
    

    2 - 创建一个新的 LB4 模型和存储库 使用自定义表名(视图名)扩展原始模型

    @model({
      settings: {
        postgresql: {schema: 'public', table: 'v_athletexerciselog'}, // custom names
      },
    })
    export class VAthletExerciseLog extends AthletExerciseLog {
      constructor(data?: Partial<VAthletExerciseLog>) {
        super(data);
      }
    }
    

    3 - 将运动模型和存储库中的相关模型名称更改为 VAthletExerciseLog(新)

    export class Exercise extends Entity {
      ...
      @hasMany(() => VAthletExerciseLog, {keyTo: 'exerciseId'})
      athletExerciseLogsExercise?: VAthletExerciseLog[];
      ...
    }
    

    4 - 从查询中删除“订单”和“限制”:

    exercise.find({
        include: [{
            relation: "athletExerciseLogsExercise",
            scope: {
                where: {
                    userId: id
                },
                //order: ['date DESC'],
                //limit: 1
            }
        }, ]
    });
    

    【讨论】:

      猜你喜欢
      • 2015-07-26
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多