【发布时间】:2021-11-20 09:52:23
【问题描述】:
我正在将 Laravel 用于一些 sass 项目,如果我们的房间在实际数字旁边接受(按字母顺序排列),则某些交易比完成晚一步 101 - A101 等。
所以 room_number 列的数据类型是 int,所以我将它转换为 varchar 到现在为止没有问题,一切正常。
收到一个新请求,我们希望以特定方式对这些房间进行排序,例如,如果我有 101、102、A101、103、B102 房间,它们必须按 101、A101、102、B102、103 排序
屏幕下方可能会给您一些想要实现的目标
根据屏幕,房间 A101 必须在房间 101 之后,房间 B102 必须在房间 102 之后等等。
我尝试了以下
Room::where(.....)
->orderByRaw("CAST(room_number as UNSIGNED) ASC")
->get();
我也尝试在拿到收藏后对其进行排序
Room::where(.....)
->orderByRaw("CAST(room_number as UNSIGNED) ASC")
->get()
->sortBy('order', SORT_REGULAR, true);
但是我所有的尝试都走上了一条死路! 我想对这些房间执行二进制搜索并应用自定义解决方案,但我想我可以先问一下,也许有人有同样的问题!
【问题讨论】:
-
这个问题有一些答案可能会有所启发:stackoverflow.com/questions/47903727/… 也许您可以让
sortBy闭包将字符移到字符串的末尾,以便在没有任何字符的数字。 -
您可以在表格中添加列吗?一个用于前缀(在这种情况下为“A”或“B”......),一个用于数字(101、102、103......)当然是整数。所以你可以先按数字排序,再按前缀排序。
-
@mulquin 嗯,这似乎是一个合理的建议,谢谢
-
@UğurArıcı 不幸的是,它是一列 room_number 但等等,你的意思是不是将 room_number 列从 int 转换为 varchar 我将其保留为 int 然后我添加一个新列可能是 room_number_alpha 并且当用户将房间号发送为 E105 我拆分传入的字符串并存储它?!!!请注意 room_number 必须是唯一的
-
@EmadRashadMuhammed 是的,对于这个特定的需求,您可以添加 2 个额外的列并根据基本和唯一的
room_number字段自动设置和更新它们。当您将任何内容设置为room_number时,您可以将room_number_prefix设置为null或给定字符串并将room_number_integer设置为给定数字。您可以在 DB 上设置这两个索引。这不是最好的,但可能是一个解决方案。
标签: php laravel sorting alphanumeric