11<?php
22namespace Kir \MySQL \Builder \Traits ;
33
4+ use Kir \MySQL \Builder \Expr \OrderBySpecification ;
5+
46trait OrderByBuilder {
57 use AbstractDB;
68
79 /** @var array */
810 private $ orderBy = array ();
911
1012 /**
11- * @param string $expression
13+ * @param string|OrderBySpecification $expression
1214 * @param string $direction
1315 * @return $this
1416 */
1517 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 ]);
2221 }
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 ;
2823 }
29- $ this ->orderBy [] = array ($ expression , $ direction );
24+ $ this ->addOrder ($ expression , $ direction );
3025 return $ this ;
3126 }
32-
27+
3328 /**
29+ * @param string $fieldName
30+ * @param array $values
31+ * @return $this
3432 */
3533 public function orderByValues ($ fieldName , array $ values ) {
3634 $ expr = [];
@@ -57,4 +55,31 @@ protected function buildOrder($query) {
5755 }
5856 return $ query .join (", \n" , $ arr )."\n" ;
5957 }
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+ }
6085}
0 commit comments