1: <?php
2:
3: namespace PHPixie\ORM\Relationships\Type\Embeds\Preload;
4:
5: abstract class Result implements \PHPixie\ORM\Steps\Result\Reusable
6: {
7: protected $reusableResult;
8: protected $embeddedPrefix;
9:
10: protected $data;
11:
12: public function __construct($reusableResult, $embeddedPrefix)
13: {
14: $this->reusableResult = $reusableResult;
15: $this->embeddedPrefix = $embeddedPrefix;
16: }
17:
18: public function offsetExists($offset)
19: {
20: $this->requireData();
21: return array_key_exists($offset, $this->data);
22: }
23:
24: public function getByOffset($offset)
25: {
26: $this->requireData();
27: return $this->data[$offset];
28: }
29:
30: protected function requireData()
31: {
32: if($this->data !== null)
33: return;
34:
35: $this->prepareData();
36: }
37:
38: protected function getEmbeddedData($data, $path)
39: {
40: if($data === null)
41: return null;
42:
43: foreach($path as $step) {
44: if(!property_exists($data, $step))
45: return null;
46: $data = $data->$step;
47: }
48:
49: return $data;
50: }
51:
52: public function getField($field, $skipNulls = true)
53: {
54: $this->requireData();
55: $values = array();
56: $path = explode('.', $field);
57:
58: foreach($this->data as $data) {
59: $value = $this->getEmbeddedData($data, $path);
60: if($value !== null || !$skipNulls) {
61: $values[] = $value;
62: }
63: }
64:
65: return $values;
66: }
67:
68: public function getFields($fields)
69: {
70: $this->requireData();
71: $rows = array();
72: $paths = array();
73:
74: foreach($fields as $field) {
75: $paths[$field] = explode('.', $field);
76: }
77:
78: foreach($this->data as $data) {
79: $row = array();
80: foreach($paths as $field => $path) {
81: $row[$field] = $this->getEmbeddedData($data, $path);
82: }
83:
84: $rows[]= $row;
85: }
86:
87: return $rows;
88: }
89:
90: public function getIterator()
91: {
92: $this->requireData();
93: return new \ArrayIterator($this->data);
94: }
95:
96: public function asArray()
97: {
98: $this->requireData();
99: return $this->data;
100: }
101:
102: protected function prepareData()
103: {
104: $this->data = array();
105: $embeddedPath = explode('.', $this->embeddedPrefix);
106: foreach($this->reusableResult as $key => $data) {
107: $embeddedData = $this->getEmbeddedData($data, $embeddedPath);
108: if($embeddedData !== null) {
109: $this->addEmbeddedData($embeddedData);
110: }
111: }
112: }
113:
114: abstract protected function addEmbeddedData($embeddedData);
115: }
116: