1: <?php
2: /**
3: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * For full copyright and license information, please see the LICENSE.txt
8: * Redistributions of files must retain the above copyright notice.
9: *
10: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
11: * @link https://cakephp.org CakePHP(tm) Project
12: * @since 3.0.0
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Database\Expression;
16:
17: use Cake\Database\ExpressionInterface;
18: use Cake\Database\ValueBinder;
19:
20: /**
21: * An expression object for ORDER BY clauses
22: */
23: class OrderByExpression extends QueryExpression
24: {
25: /**
26: * Constructor
27: *
28: * @param string|array|\Cake\Database\ExpressionInterface $conditions The sort columns
29: * @param array|\Cake\Database\TypeMap $types The types for each column.
30: * @param string $conjunction The glue used to join conditions together.
31: */
32: public function __construct($conditions = [], $types = [], $conjunction = '')
33: {
34: parent::__construct($conditions, $types, $conjunction);
35: }
36:
37: /**
38: * Convert the expression into a SQL fragment.
39: *
40: * @param \Cake\Database\ValueBinder $generator Placeholder generator object
41: * @return string
42: */
43: public function sql(ValueBinder $generator)
44: {
45: $order = [];
46: foreach ($this->_conditions as $k => $direction) {
47: if ($direction instanceof ExpressionInterface) {
48: $direction = $direction->sql($generator);
49: }
50: $order[] = is_numeric($k) ? $direction : sprintf('%s %s', $k, $direction);
51: }
52:
53: return sprintf('ORDER BY %s', implode(', ', $order));
54: }
55:
56: /**
57: * Auxiliary function used for decomposing a nested array of conditions and
58: * building a tree structure inside this object to represent the full SQL expression.
59: *
60: * New order by expressions are merged to existing ones
61: *
62: * @param array $orders list of order by expressions
63: * @param array $types list of types associated on fields referenced in $conditions
64: * @return void
65: */
66: protected function _addConditions(array $orders, array $types)
67: {
68: foreach ($orders as $key => $val) {
69: if (is_string($key) && is_string($val) && !in_array(strtoupper($val), ['ASC', 'DESC'], true)) {
70: deprecationWarning(
71: 'Passing extra sort expressions by associative array is deprecated. ' .
72: 'Use QueryExpression or numeric array instead.'
73: );
74: }
75: }
76: $this->_conditions = array_merge($this->_conditions, $orders);
77: }
78: }
79: