1
1
<?php
2
2
namespace Kir \MySQL \Builder \Traits ;
3
3
4
+ use Kir \MySQL \Builder \Expr \OrderBySpecification ;
5
+
4
6
trait OrderByBuilder {
5
7
use AbstractDB;
6
8
7
9
/** @var array */
8
10
private $ orderBy = array ();
9
11
10
12
/**
11
- * @param string $expression
13
+ * @param string|OrderBySpecification $expression
12
14
* @param string $direction
13
15
* @return $this
14
16
*/
15
17
public function orderBy ($ expression , $ direction = 'asc ' ) {
16
- if (strtolower ($ direction ) != 'desc ' ) {
17
- $ direction = 'ASC ' ;
18
- }
19
- if (is_array ($ expression )) {
20
- if (!count ($ expression )) {
21
- return $ this ;
18
+ if ($ expression instanceof OrderBySpecification) {
19
+ foreach ($ expression ->getFields () as $ field ) {
20
+ $ this ->addOrder ($ field [0 ], $ field [1 ]);
22
21
}
23
- $ arguments = array (
24
- $ expression [0 ],
25
- array_slice ($ expression , 1 )
26
- );
27
- $ expression = call_user_func_array (array ($ this ->db (), 'quoteExpression ' ), $ arguments );
22
+ return $ this ;
28
23
}
29
- $ this ->orderBy [] = array ($ expression , $ direction );
24
+ $ this ->addOrder ($ expression , $ direction );
30
25
return $ this ;
31
26
}
32
-
27
+
33
28
/**
29
+ * @param string $fieldName
30
+ * @param array $values
31
+ * @return $this
34
32
*/
35
33
public function orderByValues ($ fieldName , array $ values ) {
36
34
$ expr = [];
@@ -57,4 +55,31 @@ protected function buildOrder($query) {
57
55
}
58
56
return $ query .join (", \n" , $ arr )."\n" ;
59
57
}
58
+
59
+ /**
60
+ * @param string $expression
61
+ * @param string $direction
62
+ */
63
+ private function addOrder ($ expression , $ direction ) {
64
+ $ direction = $ this ->fixDirection ($ direction );
65
+ if (is_array ($ expression )) {
66
+ if (!count ($ expression )) {
67
+ return ;
68
+ }
69
+ $ arguments = array (
70
+ $ expression [0 ],
71
+ array_slice ($ expression , 1 )
72
+ );
73
+ $ expression = call_user_func_array (array ($ this ->db (), 'quoteExpression ' ), $ arguments );
74
+ }
75
+ $ this ->orderBy [] = array ($ expression , $ direction );
76
+ }
77
+
78
+ /**
79
+ * @param string $direction
80
+ * @return string
81
+ */
82
+ private function fixDirection ($ direction ) {
83
+ return strtoupper ($ direction ) !== 'ASC ' ? 'DESC ' : 'ASC ' ;
84
+ }
60
85
}
0 commit comments