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: /**
27: * Constructor
28: *
29: * @param string|array|\Cake\Database\ExpressionInterface $conditions The sort columns
30: * @param array|\Cake\Database\TypeMap $types The types for each column.
31: * @param string $conjunction The glue used to join conditions together.
32: */
33: public function __construct($conditions = [], $types = [], $conjunction = '')
34: {
35: parent::__construct($conditions, $types, $conjunction);
36: }
37:
38: /**
39: * Convert the expression into a SQL fragment.
40: *
41: * @param \Cake\Database\ValueBinder $generator Placeholder generator object
42: * @return string
43: */
44: public function sql(ValueBinder $generator)
45: {
46: $order = [];
47: foreach ($this->_conditions as $k => $direction) {
48: if ($direction instanceof ExpressionInterface) {
49: $direction = $direction->sql($generator);
50: }
51: $order[] = is_numeric($k) ? $direction : sprintf('%s %s', $k, $direction);
52: }
53:
54: return sprintf('ORDER BY %s', implode(', ', $order));
55: }
56:
57: /**
58: * Auxiliary function used for decomposing a nested array of conditions and
59: * building a tree structure inside this object to represent the full SQL expression.
60: *
61: * New order by expressions are merged to existing ones
62: *
63: * @param array $orders list of order by expressions
64: * @param array $types list of types associated on fields referenced in $conditions
65: * @return void
66: */
67: protected function _addConditions(array $orders, array $types)
68: {
69: foreach ($orders as $key => $val) {
70: if (is_string($key) && is_string($val) && !in_array(strtoupper($val), ['ASC', 'DESC'], true)) {
71: deprecationWarning(
72: 'Passing extra sort expressions by associative array is deprecated. ' .
73: 'Use QueryExpression or numeric array instead.'
74: );
75: }
76: }
77: $this->_conditions = array_merge($this->_conditions, $orders);
78: }
79: }
80: