Laravel/PHP:按字母顺序排列,按顺序排列

Tob*_*lor 8 php mysql laravel

按字母顺序订购时,我留下了这个:

S1 Episode 1
S1 Episode 11
S1 Episode 12
S1 Episode 2
S1 Episode 3

S2 Episode 1
S2 Episode 11
Run Code Online (Sandbox Code Playgroud)

示例代码:

DB::table('test')->orderby('title', 'ASC')->get();
Run Code Online (Sandbox Code Playgroud)

等等我需要这些才能正确订购.有解决方案吗

谢谢.

sja*_*agr 12

您正面临着以字母数字或计算机科学术语对自然分类进行分类的问题.

许多方法可以使用直接的MySQL实现自然排序,但您也可以将Laravel帮助器的结果转换为数组格式并实现PHP的natsort功能.

从我上面找到的方法中,我得出了可能通过示例代码解决问题的最佳方法:

DB::table('test')->orderBy('LENGTH(title)', 'ASC')
    ->orderBy('title', 'ASC')
    ->get();
Run Code Online (Sandbox Code Playgroud)

但是我不确定帮助者是否会抱怨在函数中接收MySQL函数而不是直列名orderBy.我只是从我和你的例子一起使用的参考文献中抄写 - 我无法保证其功效.

  • 为我工作,但我必须使用orderByRaw(LENGTH(field),'ASC')。非常感谢,非常直观的解决方案。 (2认同)

Erh*_*nam 5

对于 Laravel 这也适用:

$collection = $collection->sortBy('order', SORT_REGULAR, true);
Run Code Online (Sandbox Code Playgroud)


小智 5

可能会迟到,但对其他人来说可能会有所帮助。

根据我在下面找到的上述链接,我得出了可能使用示例代码解决您的问题的最佳方法:https : //www.electrictoolbox.com/mysql-order-string-as-int/

询问

SELECT * FROM <table> ORDER BY CAST(<column> AS unsigned)
Run Code Online (Sandbox Code Playgroud)

laravel 的例子

DB::table('test')
    ->orderByRaw("CAST(title as UNSIGNED) ASC")
    ->get();
Run Code Online (Sandbox Code Playgroud)