@@ -1028,38 +1028,37 @@ protected function applyScoutSearch(string $search_keyword): bool
1028
1028
protected function applyFixedOrderingToQuery (string $ keyName , array $ orderedKeys )
1029
1029
{
1030
1030
$ connection = $ this ->getConnection ();
1031
- $ driver_name = $ connection ->getDriverName ();
1031
+ $ driverName = $ connection ->getDriverName ();
1032
1032
1033
1033
// Escape keyName and orderedKeys
1034
- $ rawKeyName = $ keyName ;
1035
- $ keyName = $ connection ->escape ($ keyName );
1034
+ $ keyName = $ connection ->getQueryGrammar ()->wrap ($ keyName );
1036
1035
$ orderedKeys = collect ($ orderedKeys )
1037
1036
->map (function ($ value ) use ($ connection ) {
1038
1037
return $ connection ->escape ($ value );
1039
1038
});
1040
1039
1041
- switch ($ driver_name ) {
1040
+ switch ($ driverName ) {
1042
1041
case 'mysql ' :
1043
- // MySQL / MariaDB
1044
1042
$ this ->query ->orderByRaw ("FIELD( $ keyName, " .$ orderedKeys ->implode (', ' ).') ' );
1045
1043
return true ;
1046
1044
1047
- /*
1048
- TODO: test implementations, fix if necessary and uncomment
1049
- case 'pgsql':
1050
- // PostgreSQL
1051
- $this->query->orderByRaw("array_position(ARRAY[" . $orderedKeys->implode(',') . "], $keyName)");
1052
- return true;
1053
-
1054
- */
1045
+ case 'pgsql ' :
1046
+ case 'oracle ' :
1047
+ $ this ->query ->orderByRaw (
1048
+ "CASE "
1049
+ .
1050
+ $ orderedKeys
1051
+ ->map (fn ($ value , $ index ) => "WHEN $ keyName= $ value THEN $ index " )
1052
+ ->implode (' ' )
1053
+ .
1054
+ " END "
1055
+ );
1056
+ return true ;
1055
1057
1056
1058
case 'sqlite ' :
1057
1059
case 'sqlsrv ' :
1058
- // SQLite & Microsoft SQL Server
1059
- // Compatible with all SQL drivers (but ugly solution)
1060
-
1061
1060
$ this ->query ->orderByRaw (
1062
- "CASE ` $ rawKeyName ` "
1061
+ "CASE $ keyName "
1063
1062
.
1064
1063
$ orderedKeys
1065
1064
->map (fn ($ value , $ index ) => "WHEN $ value THEN $ index " )
0 commit comments