如果您使用的是 AdonisJS 并且具有混合 ID,例如 ABC-202、ABC-201...,您可以将原始查询与 Query Builder 结合起来,并按如下方式实现上述解决方案 (https://stackoverflow.com/a/25061144/4040835):
const sortField =
'membership_id'
const sortDirection =
'asc'
const subquery = UserProfile.query()
.select(
'user_profiles.id',
'user_profiles.user_id',
'user_profiles.membership_id',
'user_profiles.first_name',
'user_profiles.middle_name',
'user_profiles.last_name',
'user_profiles.mobile_number',
'countries.citizenship',
'states.name as state_of_origin',
'user_profiles.gender',
'user_profiles.created_at',
'user_profiles.updated_at'
)
.leftJoin(
'users',
'user_profiles.user_id',
'users.id'
)
.leftJoin(
'countries',
'user_profiles.nationality',
'countries.id'
)
.leftJoin(
'states',
'user_profiles.state_of_origin',
'states.id'
)
.orderByRaw(
`SUBSTRING(:sortField:,3,15)*1 ${sortDirection}`,
{
sortField: sortField,
}
)
.paginate(
page,
per_page
)
注意事项:
在这一行:SUBSTRING(:sortField:,3,15)*1 ${sortDirection},
-
'3' 代表数字前最后一个非数字字符的索引号。如果您的混合 ID 是“ABC-123”,那么您的索引号将为 4。
-
'15' 用于在连字符后捕获尽可能多的数字。
-
'1' 对子字符串执行数学运算,有效地将子字符串转换为数字。
参考 1:您可以在此处阅读有关原始查询中的参数绑定的更多信息:https://knexjs.org/#Raw-Bindings
参考 2:Adonis 原始查询:https://adonisjs.com/docs/4.1/query-builder#_raw_queries