| @@ 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. |
|