MongoActiveRecord.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. /**
  3. * 拓展MongoDB-ActiveRecord
  4. * 添加fields()和extraFields()函数
  5. * 重写toArray()函数,根据需要取回调函数对字段进行整理
  6. */
  7. class MongoActiveRecord extends MongoAr {
  8. public function __construct($scenario = 'insert') {
  9. parent::__construct($scenario);
  10. }
  11. /**
  12. * 需要处理的字段
  13. *
  14. * @return [
  15. * 'field_1', // 直接返回对应attribute
  16. * 'field_2' => function() {}, // 回调函数模式
  17. * ];
  18. */
  19. public function baseFields() {
  20. return [];
  21. }
  22. /**
  23. * 需要处理的拓展字段
  24. *
  25. * @return [
  26. * 'field' => function() {}, // 回调函数模式
  27. * ];
  28. */
  29. public function extraFields() {
  30. return [];
  31. }
  32. /**
  33. * 根据需要的字段名取相应的回调函数处理字段
  34. *
  35. * @param Array $fields : 需要处理的字段,默认为空。为空则返回所有已在baseFields()中定义的字段。
  36. * 当baseFields()函数及本参数均为空时会返回AR对象所有属性值,其中_id会被转换为字符串。
  37. * @param Array $extraFields : 需要处理的拓展字段,为空则不处理拓展字段。
  38. *
  39. * @return Array $result : 处理结果
  40. */
  41. public function asArray($fields = [], $extraFields = []) {
  42. $result = [];
  43. $_fields = $this->baseFields();
  44. // fields
  45. if (!$fields && !$_fields) {
  46. foreach ($this->attributes as $key => $value) {
  47. if ($key == '_id') {
  48. $result[$key] = (string)$this->_id;
  49. continue;
  50. }
  51. $result[$key] = $value;
  52. }
  53. } else {
  54. foreach ($_fields as $key => $defination) {
  55. if (is_int($key)) {
  56. $key = $defination;
  57. if ($fields && !in_array($key, $fields)) {
  58. continue;
  59. }
  60. if ($key == 'id' || $key == '_id') {
  61. $result[$key] = (string)$this->_id;
  62. continue;
  63. }
  64. $result[$key] = $this->attributes[$key];
  65. continue;
  66. } else {
  67. if ($fields && !in_array($key, $fields)) {
  68. continue;
  69. }
  70. if (is_callable($defination)) {
  71. $result[$key] = call_user_func($defination);
  72. } else {
  73. $result[$key] = $defination;
  74. }
  75. }
  76. }
  77. }
  78. // extraFields
  79. if ($extraFields) {
  80. $_extraFields = $this->extraFields();
  81. foreach ($extraFields as $value) {
  82. if (is_callable($_extraFields[$value])) {
  83. $result[$value] = call_user_func($_extraFields[$value]);
  84. } else {
  85. $result[$value] = $_extraFields[$value];
  86. }
  87. }
  88. }
  89. return $result;
  90. }
  91. /**
  92. * 获取AR对象的属性值
  93. *
  94. * @param String $field : 字段名
  95. * @param Mixed $default : 当字段不存在时默认返回的值
  96. * @param String $trans : 可选,转换函数,例如`intval`
  97. *
  98. * @return Mixed $result : 结果
  99. */
  100. public function getAttr($field, $default, $trans = '') {
  101. $result = isset($this->$field)? $this->$field : $default;
  102. if ($trans) {
  103. $result = $trans($result);
  104. }
  105. return $result;
  106. }
  107. }