@@ 347-388 (lines=42) @@ | ||
344 | * |
|
345 | * @return void |
|
346 | */ |
|
347 | protected function addItemToResultsUsingKeyBy(&$results, BitrixModel $object) |
|
348 | { |
|
349 | $item = $object->fields; |
|
350 | if (!isset($item[$this->keyBy])) { |
|
351 | throw new LogicException("Field {$this->keyBy} is not found in object"); |
|
352 | } |
|
353 | ||
354 | $keyByValue = $item[$this->keyBy]; |
|
355 | ||
356 | if (!isset($results[$keyByValue])) { |
|
357 | $results[$keyByValue] = $object; |
|
358 | } else { |
|
359 | $oldFields = $results[$keyByValue]->fields; |
|
360 | foreach ($oldFields as $field => $oldValue) { |
|
361 | // пропускаем служебные поля. |
|
362 | if (in_array($field, ['_were_multiplied', 'PROPERTIES'])) { |
|
363 | continue; |
|
364 | } |
|
365 | ||
366 | $alreadyMultiplied = !empty($oldFields['_were_multiplied'][$field]); |
|
367 | ||
368 | // мультиплицируем только несовпадающие значения полей |
|
369 | $newValue = $item[$field]; |
|
370 | if ($oldValue !== $newValue) { |
|
371 | // если еще не мультиплицировали поле, то его надо превратить в массив. |
|
372 | if (!$alreadyMultiplied) { |
|
373 | $oldFields[$field] = [ |
|
374 | $oldFields[$field] |
|
375 | ]; |
|
376 | $oldFields['_were_multiplied'][$field] = true; |
|
377 | } |
|
378 | ||
379 | // добавляем новое значению поле если такого еще нет. |
|
380 | if (empty($oldFields[$field]) || (is_array($oldFields[$field]) && !in_array($newValue, $oldFields[$field]))) { |
|
381 | $oldFields[$field][] = $newValue; |
|
382 | } |
|
383 | } |
|
384 | } |
|
385 | ||
386 | $results[$keyByValue]->fields = $oldFields; |
|
387 | } |
|
388 | } |
|
389 | ||
390 | /** |
|
391 | * Determine if all fields must be selected. |
@@ 121-163 (lines=43) @@ | ||
118 | return new Collection($items); |
|
119 | } |
|
120 | ||
121 | protected function addItemToResultsUsingKeyBy(&$results, HLModel $object) |
|
122 | { |
|
123 | $item = $object->fields; |
|
124 | ||
125 | if (!isset($item[$this->keyBy])) { |
|
126 | throw new LogicException("Field {$this->keyBy} is not found in object"); |
|
127 | } |
|
128 | ||
129 | $keyByValue = $item[$this->keyBy]; |
|
130 | ||
131 | if (!isset($results[$keyByValue])) { |
|
132 | $results[$keyByValue] = $object; |
|
133 | } else { |
|
134 | $oldFields = $results[$keyByValue]->fields; |
|
135 | foreach ($oldFields as $field => $oldValue) { |
|
136 | // пропускаем служебные поля. |
|
137 | if (in_array($field, ['_were_multiplied', 'PROPERTIES'])) { |
|
138 | continue; |
|
139 | } |
|
140 | ||
141 | $alreadyMultiplied = !empty($oldFields['_were_multiplied'][$field]); |
|
142 | ||
143 | // мультиплицируем только несовпадающие значения полей |
|
144 | $newValue = $item[$field]; |
|
145 | if ($oldValue !== $newValue) { |
|
146 | // если еще не мультиплицировали поле, то его надо превратить в массив. |
|
147 | if (!$alreadyMultiplied) { |
|
148 | $oldFields[$field] = [ |
|
149 | $oldFields[$field] |
|
150 | ]; |
|
151 | $oldFields['_were_multiplied'][$field] = true; |
|
152 | } |
|
153 | ||
154 | // добавляем новое значению поле если такого еще нет. |
|
155 | if (empty($oldFields[$field]) || (is_array($oldFields[$field]) && !in_array($newValue, $oldFields[$field]))) { |
|
156 | $oldFields[$field][] = $newValue; |
|
157 | } |
|
158 | } |
|
159 | } |
|
160 | ||
161 | $results[$keyByValue]->fields = $oldFields; |
|
162 | } |
|
163 | } |
|
164 | ||
165 | /** |
|
166 | * Get count of elements that match $filter. |