IHP框架下Haskell QueryBuilder先过滤后排序实现方案咨询
IHP Student表先过滤后排序的优雅实现方案
类型不匹配根因
调用queryOr进行或条件查询后,IHP会返回NoJoinQueryBuilderWrapper "students"类型,与基础查询的QueryBuilder "students"类型不兼容,导致后续排序逻辑无法直接通用。
实现代码
核心通过toQueryBuilder方法将过滤后的查询统一对齐为QueryBuilder类型,无需冗余排序代码也不需要无意义的空queryOr调用:
students <- do -- 基础查询构造 let baseQuery = query @Student -- 过滤逻辑处理,统一对齐类型 let filteredQuery = case searchString' of Just keyword -> baseQuery |> queryOr (\q -> q |> whereLike #lastName ("%" <> keyword <> "%")) |> queryOr (\q -> q |> whereLike #firstMidName ("%" <> keyword <> "%")) |> toQueryBuilder Nothing -> baseQuery -- 统一复用排序逻辑 let sortedQuery = case sortOrder of Just "lastName_desc" -> filteredQuery |> orderByDesc #lastName Just "lastName_asc" -> filteredQuery |> orderByAsc #lastName Just "name_desc" -> filteredQuery |> orderByDesc #firstMidName Just "name_asc" -> filteredQuery |> orderByAsc #firstMidName _ -> filteredQuery |> orderByAsc #lastName -- 默认排序规则 sortedQuery |> fetch
方案优势
- 仅在或查询分支增加
toQueryBuilder调用完成类型对齐,无多余noop逻辑 - 排序逻辑全量复用,无需在每个过滤分支重复定义
- 完全符合IHP类型系统约束,无运行时风险
内容的提问来源于stack exchange,提问作者dharmatech
相关产品推荐
相关产品推荐

