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\Statement;
16:
17: /**
18: * Wraps a statement in a callback that allows row results
19: * to be modified when being fetched.
20: *
21: * This is used by CakePHP to eagerly load association data.
22: */
23: class CallbackStatement extends StatementDecorator
24: {
25:
26: /**
27: * A callback function to be applied to results.
28: *
29: * @var callable
30: */
31: protected $_callback;
32:
33: /**
34: * Constructor
35: *
36: * @param \Cake\Database\StatementInterface $statement The statement to decorate.
37: * @param \Cake\Database\Driver $driver The driver instance used by the statement.
38: * @param callable $callback The callback to apply to results before they are returned.
39: */
40: public function __construct($statement, $driver, $callback)
41: {
42: parent::__construct($statement, $driver);
43: $this->_callback = $callback;
44: }
45:
46: /**
47: * Fetch a row from the statement.
48: *
49: * The result will be processed by the callback when it is not `false`.
50: *
51: * @param string $type Either 'num' or 'assoc' to indicate the result format you would like.
52: * @return array|false
53: */
54: public function fetch($type = parent::FETCH_TYPE_NUM)
55: {
56: $callback = $this->_callback;
57: $row = $this->_statement->fetch($type);
58:
59: return $row === false ? $row : $callback($row);
60: }
61:
62: /**
63: * Fetch all rows from the statement.
64: *
65: * Each row in the result will be processed by the callback when it is not `false.
66: *
67: * @param string $type Either 'num' or 'assoc' to indicate the result format you would like.
68: * @return array
69: */
70: public function fetchAll($type = parent::FETCH_TYPE_NUM)
71: {
72: return array_map($this->_callback, $this->_statement->fetchAll($type));
73: }
74: }
75: