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