File tree Expand file tree Collapse file tree 3 files changed +68
-1
lines changed Expand file tree Collapse file tree 3 files changed +68
-1
lines changed Original file line number Diff line number Diff line change @@ -89,6 +89,13 @@ Sieve will also allow consumers of your API to specify sort order. You can do th
89
89
* ` sort=age:asc `
90
90
* ` sort=id:desc `
91
91
92
+ By default, MySQL will sort ` null ` values first for ascending sorts and last for descending sorts. Depending on the context
93
+ of the column this may not be the desired functionality. You can change this using the following URL queries:
94
+
95
+ * ` sort=priority:asc_nulls_last `
96
+ * ` sort=priority:desc_nulls_first `
97
+
98
+
92
99
You can set a default sort using the ` setDefaultSort ` on the` Sieve ` class.
93
100
94
101
``` php
Original file line number Diff line number Diff line change @@ -12,6 +12,8 @@ class Sieve
12
12
13
13
protected $ defaultSort = null ;
14
14
15
+ protected $ sortable = [];
16
+
15
17
public function __construct (Request $ request )
16
18
{
17
19
$ this ->request = $ request ;
@@ -37,7 +39,7 @@ public function getFilters()
37
39
public function apply ($ queryBuilder )
38
40
{
39
41
foreach ($ this ->getFilters () as $ sieveFilter ) {
40
- /** @var Filter */
42
+ /** @var ModifiesQueries */
41
43
$ filter = $ sieveFilter ['filter ' ];
42
44
$ property = $ sieveFilter ['property ' ];
43
45
@@ -77,6 +79,16 @@ public function apply($queryBuilder)
77
79
if ($ this ->getSort () == "$ property:asc " ) {
78
80
$ queryBuilder ->orderBy ($ column , "asc " );
79
81
}
82
+
83
+ if ($ this ->getSort () == "$ property:asc_nulls_last " ) {
84
+ $ queryBuilder ->orderByRaw ("ISNULL( \"$ column \") asc " )
85
+ ->orderBy ($ column , 'asc ' );
86
+ }
87
+
88
+ if ($ this ->getSort () == "$ property:desc_nulls_first " ) {
89
+ $ queryBuilder ->orderByRaw ("ISNULL( \"$ column \") desc " )
90
+ ->orderBy ($ column , 'desc ' );
91
+ }
80
92
}
81
93
82
94
return $ this ;
Original file line number Diff line number Diff line change @@ -74,6 +74,54 @@ public function applies_sieve_sorts_to_a_query_builder_asc()
74
74
);
75
75
}
76
76
77
+ /**
78
+ * @test
79
+ */
80
+ public function applies_sieve_sorts_to_a_query_builder_asc_nulls_last ()
81
+ {
82
+ $ request = Request::create ('/ ' , 'GET ' , [
83
+ 'sort ' => 'name:asc_nulls_last ' ,
84
+ ]);
85
+
86
+ $ seive = new Sieve ($ request );
87
+ $ seive ->addFilter ('name ' , new StringFilter );
88
+
89
+ /** @var Builder */
90
+ $ builder = $ this ->app ->make (Builder::class);
91
+ $ builder ->from ('pets ' );
92
+
93
+ $ seive ->apply ($ builder );
94
+
95
+ $ this ->assertEquals (
96
+ 'select * from "pets" order by ISNULL("name") asc, "name" asc ' ,
97
+ $ builder ->toSql ()
98
+ );
99
+ }
100
+
101
+ /**
102
+ * @test
103
+ */
104
+ public function applies_sieve_sorts_to_a_query_builder_desc_nulls_first ()
105
+ {
106
+ $ request = Request::create ('/ ' , 'GET ' , [
107
+ 'sort ' => 'name:desc_nulls_first ' ,
108
+ ]);
109
+
110
+ $ seive = new Sieve ($ request );
111
+ $ seive ->addFilter ('name ' , new StringFilter );
112
+
113
+ /** @var Builder */
114
+ $ builder = $ this ->app ->make (Builder::class);
115
+ $ builder ->from ('pets ' );
116
+
117
+ $ seive ->apply ($ builder );
118
+
119
+ $ this ->assertEquals (
120
+ 'select * from "pets" order by ISNULL("name") desc, "name" desc ' ,
121
+ $ builder ->toSql ()
122
+ );
123
+ }
124
+
77
125
/**
78
126
* @test
79
127
*/
You can’t perform that action at this time.
0 commit comments