Commit 5f31c88c authored by lhy's avatar lhy :speech_balloon:
Browse files

Added reverse sort for nullable field

1 merge request!10Null Sort Latest
......@@ -52,6 +52,9 @@ class Sort extends BaseObject
$field = substr($field, 1);
$sort = 'desc';
}
if ($this->isStarredNullField($field)) {
$sort = $sort === 'asc' ? 'desc' : 'asc';
}
}
$params[$field] = $sort;
......@@ -60,6 +63,11 @@ class Sort extends BaseObject
return $params;
}
private function isStarredNullField($field)
{
return $field[strlen($field) - 1] === '*';
}
public function getOrders()
{
$rules = $this->normalizedSortRules();
......@@ -67,11 +75,17 @@ class Sort extends BaseObject
$orders = [];
foreach ($params as $field => $sort) {
if (!isset($rules[$field])) {
$ruleField = $field;
if ($this->isStarredNullField($field)) {
$ruleField = substr($field, 0, strlen($field) - 1);
$field = '-' . $ruleField;
}
if (! isset($rules[$ruleField])) {
continue;
}
$sortDef = $rules[$field];
$sortDef = $rules[$ruleField];
if ($sortDef && is_callable($sortDef)) {
$orders[$field] = $sortDef;
......
......@@ -61,7 +61,11 @@ class CapsuleCompiler implements Compiler
public function buildSort(array $orders)
{
foreach ($orders as $field => $direction) {
$this->query->orderBy($field, $direction);
if ($field[0] === '-') {
$this->query->orderByRaw("$field $direction");
} else {
$this->query->orderBy($field, $direction);
}
}
}
......
......@@ -67,6 +67,9 @@ class Yii2Compiler implements Compiler
];
foreach ($orders as $key => $order) {
if ($key[0] === '-') {
throw new \InvalidArgumentException('Unsupported yet.');
}
$orders[$key] = $orderMap[$order] ?? $order;
}
......
......@@ -33,7 +33,7 @@ class SortTest extends \PHPUnit_Framework_TestCase
[
'',
[],
]
],
];
}
......@@ -90,7 +90,19 @@ class SortTest extends \PHPUnit_Framework_TestCase
[
'name' => 'asc',
'gender' => 'desc',
]
],
],
// reverse null sort
[
'expired_at*,-gender',
[
'expired_at',
'gender',
],
[
'-expired_at' => 'desc',
'gender' => 'desc',
],
],
];
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment