CallbackStatement.php 2.3 KB

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