Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
denx-b committed Aug 15, 2017
1 parent e306b67 commit 9272be8
Showing 1 changed file with 31 additions and 4 deletions.
35 changes: 31 additions & 4 deletions lib/EntityManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -376,8 +376,8 @@ protected function processReferencesData()
* @var Entity\ReferenceField $reference
*/
$reference = $fields[$fieldName];
$referenceDataSet = $this->linkDataSet($reference, $referenceDataSet);
$referenceStaleDataSet = $this->getReferenceDataSet($reference);
$referenceDataSet = $this->linkDataSet($reference, $referenceDataSet, $referenceStaleDataSet);
$fieldWidget = $this->getFieldWidget($fieldName);
$variantsField = $fieldWidget->getSettings('VARIANTS');

Expand Down Expand Up @@ -599,11 +599,15 @@ protected function getReferenceDataSet(Entity\ReferenceField $reference)
*
* @return array
*/
protected function linkData(Entity\ReferenceField $reference, array $referenceData)
protected function linkData(Entity\ReferenceField $reference, array $referenceData, array $referenceStaleDataSet)
{
// Парсим условия связи двух моделей
$referenceConditions = $this->getReferenceConditions($reference);

// Получение ID связанного элемента
if ($ID = $this->getLinkDataId($referenceData, $referenceStaleDataSet))
$referenceData['ID'] = $ID;

foreach ($referenceConditions as $refField => $refValue) {
// Так как в условиях связи между моделями в основном отношения типа this.field => ref.field или
// ref.field => SqlExpression, мы можем использовать это для подстановки данных
Expand All @@ -623,21 +627,44 @@ protected function linkData(Entity\ReferenceField $reference, array $referenceDa

/**
* Связывает набор связанных данных с основной моделю.
* Все таблицы Битрикс обязательно имеют поле ID, поэтому здесь это явно прописано.
*
* @param Entity\ReferenceField $reference
* @param array $referenceDataSet
*
* @return array
*/
protected function linkDataSet(Entity\ReferenceField $reference, array $referenceDataSet)
protected function linkDataSet(
Entity\ReferenceField $reference,
array $referenceDataSet,
array $referenceStaleDataSet
)
{
foreach ($referenceDataSet as $key => $referenceData) {
$referenceDataSet[$key] = $this->linkData($reference, $referenceData);
$referenceDataSet[$key] = $this->linkData($reference, $referenceData, $referenceStaleDataSet);
}

return $referenceDataSet;
}

/**
* Возвращает ID связанного элемента. Для поиска используются ранее полученные данные,
* Что позволяет избежать дополнительных запросов для поиска ID элементов.
* В звязанной таблице имя поля идентификатора всегда 'ID', а имя поля значения всегда 'VALUE'
*
* @param array $referenceDataSet устанавливаемое значение
* @param array $referenceStaleDataSet установленные ранее значения
*/
protected function getLinkDataId(array $referenceDataSet, array $referenceStaleDataSet)
{
foreach ($referenceStaleDataSet as $item) {
if ($item['VALUE'] == $referenceDataSet['VALUE'])
return $item['ID'];
}

return null;
}

/**
* Парсинг условий связи между моделями.
*
Expand Down

0 comments on commit 9272be8

Please sign in to comment.