Nếu bạn đang sử dụng AdonisJS và có các ID hỗn hợp như ABC-202, ABC-201 ..., bạn có thể kết hợp các truy vấn thô với Trình tạo truy vấn và triển khai giải pháp ở trên ( https://stackoverflow.com/a/25061144/4040835 ) như sau:
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
)
GHI CHÚ:
Trong dòng này : SUBSTRING(:sortField:,3,15)*1 ${sortDirection}
,
- '3' là viết tắt của số chỉ mục của ký tự không số cuối cùng trước các chữ số. Nếu ID hỗn hợp của bạn là "ABC-123", số chỉ mục của bạn sẽ là 4.
- '15' được sử dụng để bắt càng nhiều số chữ số càng tốt sau dấu gạch nối.
- '1' thực hiện một phép toán trên chuỗi con, điều này có hiệu quả chuyển chuỗi con thành một số.
Tham chiếu 1: Bạn có thể đọc thêm về các ràng buộc tham số trong các truy vấn thô tại đây: https://knexjs.org/#Raw-Bindings
Tham chiếu 2: Truy vấn thô Adonis: https://adonisjs.com/docs/4.1/query-builder# _raw_queries