@@ -143,6 +143,13 @@ class Datatables
143
143
*/
144
144
protected $ autoFilter = true ;
145
145
146
+ /**
147
+ * Flag for ordering NULLS LAST option.
148
+ *
149
+ * @var boolean
150
+ */
151
+ protected $ nullsLast = false ;
152
+
146
153
/**
147
154
* Flag for DT version
148
155
*
@@ -345,6 +352,13 @@ private function count()
345
352
->setBindings ($ bindings )->count ();
346
353
}
347
354
355
+ public function orderByNullsLast ()
356
+ {
357
+ $ this ->nullsLast = true ;
358
+
359
+ return $ this ;
360
+ }
361
+
348
362
/**
349
363
* Organizes works
350
364
*
@@ -356,7 +370,7 @@ public function make($mDataSupport = false)
356
370
// set mData support flag
357
371
$ this ->mDataSupport = $ mDataSupport ;
358
372
359
- // check if auto filtering was overidden
373
+ // check if auto filtering was overridden
360
374
if ($ this ->autoFilter ) {
361
375
$ this ->doFiltering ();
362
376
}
@@ -528,6 +542,31 @@ public function isCaseInsensitive()
528
542
return Config::get ('datatables::search.case_insensitive ' , false );
529
543
}
530
544
545
+ /**
546
+ * Get config ordering nulls last
547
+ *
548
+ * @return boolean
549
+ */
550
+ public function isNullsLast ()
551
+ {
552
+ return $ this ->nullsLast ;
553
+ }
554
+
555
+ /**
556
+ * Get NULLS LAST SQL.
557
+ *
558
+ * @param $column
559
+ * @param $direction
560
+ * @return string
561
+ */
562
+ private function getNullsLastSql ($ column , $ direction )
563
+ {
564
+ $ sql = Config::get ('datatables::order.nulls_last_sql ' , '%s %s NULLS LAST ' );
565
+
566
+ return sprintf ($ sql , $ column , $ direction );
567
+ }
568
+
569
+
531
570
/**
532
571
* Clean columns name
533
572
*
@@ -687,17 +726,31 @@ private function doOrdering()
687
726
$ column = $ this ->input ['columns ' ][$ order_col ];
688
727
if ($ column ['orderable ' ] == "true " ) {
689
728
if (! empty ($ column ['name ' ])) {
690
- $ this ->query ->orderBy ($ column ['name ' ], $ order_dir );
729
+ if ($ this ->isNullsLast ()){
730
+ $ this ->query ->orderByRaw ($ this ->getNullsLastSql ($ column ['name ' ], $ order_dir ));
731
+
732
+ }else {
733
+ $ this ->query ->orderBy ($ column ['name ' ], $ order_dir );
734
+ }
691
735
} elseif (isset ($ this ->columns [$ order_col ])) {
692
736
$ column_name = $ this ->getColumnName ($ this ->columns [$ order_col ]);
693
- $ this ->query ->orderBy ($ column_name , $ order_dir );
737
+ if ($ this ->isNullsLast ()){
738
+ $ this ->query ->orderByRaw ($ this ->getNullsLastSql ($ column_name , $ order_dir ));
739
+ }else {
740
+ $ this ->query ->orderBy ($ column_name , $ order_dir );
741
+ }
742
+
694
743
}
695
744
}
696
745
} else {
697
746
if (isset ($ this ->columns [$ order_col ])) {
698
747
if ($ this ->input ['columns ' ][$ order_col ]['orderable ' ] == "true " ) {
699
748
$ column_name = $ this ->getColumnName ($ this ->columns [$ order_col ]);
700
- $ this ->query ->orderBy ($ column_name , $ order_dir );
749
+ if ($ this ->isNullsLast ()){
750
+ $ this ->query ->orderByRaw ($ this ->getNullsLastSql ($ column_name , $ order_dir ));
751
+ }else {
752
+ $ this ->query ->orderBy ($ column_name , $ order_dir );
753
+ }
701
754
}
702
755
}
703
756
}
@@ -987,12 +1040,13 @@ public function removeColumn()
987
1040
* Set auto filter off and run your own filter
988
1041
*
989
1042
* @param callable $callback
1043
+ * @param $disable_auto_filter
990
1044
* @return Datatables
991
1045
* @internal param $Closure
992
1046
*/
993
- public function filter (Closure $ callback )
1047
+ public function filter (Closure $ callback, $ disable_auto_filter = false )
994
1048
{
995
- $ this ->autoFilter = false ;
1049
+ $ this ->autoFilter = $ disable_auto_filter ;
996
1050
997
1051
$ query = $ this ->query ;
998
1052
call_user_func ($ callback , $ query );
0 commit comments