- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/lib/integrity/duplicatecommunicationmatchcode.php
- Класс: Bitrix\Crm\Integrity\DuplicateCommunicationMatchCodeTable
- Вызов: DuplicateCommunicationMatchCodeTable::bulkReplaceValues
static function bulkReplaceValues($entityTypeID, $entityID, array $data)
{
$connection = \Bitrix\Main\Application::getConnection();
if(empty($data))
{
$connection->queryExecute(
"DELETE FROM b_crm_dp_comm_mcd WHERE ENTITY_TYPE_ID = {$entityTypeID} AND ENTITY_ID = {$entityID}"
);
return;
}
$currentMap = array();
foreach($data as $type => $values)
{
if(!is_array($values))
{
continue;
}
if(!isset($currentMap[$type]))
{
$currentMap[$type] = array();
}
foreach($values as $value)
{
$hash = md5($value);
$currentMap[$type][$hash] = array('value' => $value);
}
}
$persistentMap = array();
$result = $connection->query("SELECT ID, TYPE, VALUE FROM b_crm_dp_comm_mcd WHERE ENTITY_TYPE_ID = {$entityTypeID} AND ENTITY_ID = {$entityID}");
while($fields = $result->fetch())
{
$type = $fields['TYPE'];
if(!isset($persistentMap[$type]))
{
$persistentMap[$type] = array();
}
$ID = (int)$fields['ID'];
$value = $fields['VALUE'];
$hash = md5($value);
$persistentMap[$type][$hash] = array('id' => $ID, 'value' => $value);
}
$deleteIDs = array();
foreach($persistentMap as $type => $items)
{
$currentItems = isset($currentMap[$type]) ? $currentMap[$type] : array();
foreach($items as $hash => $item)
{
if(!isset($currentItems[$hash]))
{
$deleteIDs[] = $item['id'];
}
}
}
$insertItems = array();
foreach($currentMap as $type => $items)
{
$presentItems = isset($persistentMap[$type]) ? $persistentMap[$type] : array();
foreach($items as $hash => $item)
{
if(!isset($presentItems[$hash]))
{
$insertItems[] = array('type' => $type, 'value' =>$item['value']);
}
}
}
$sqlHelper = $connection->getSqlHelper();
if(!empty($deleteIDs))
{
$idsSql = implode(',', $deleteIDs);
$connection->queryExecute(
"DELETE FROM b_crm_dp_comm_mcd WHERE ID IN ({$idsSql})"
);
}
if(!empty($insertItems))
{
if($connection instanceof \Bitrix\Main\DB\MysqlCommonConnection)
{
$valueData = array();
foreach($insertItems as $item)
{
$typeSql = $sqlHelper->forSql($item['type']);
$valueSql = $sqlHelper->forSql($item['value']);
$valueData[] = "({$entityTypeID}, {$entityID}, '{$typeSql}', '{$valueSql}')";
}
$valuesSql = implode(', ', $valueData);
$connection->queryExecute(
"INSERT INTO b_crm_dp_comm_mcd(ENTITY_TYPE_ID, ENTITY_ID, TYPE, VALUE) VALUES {$valuesSql}"
);
}
elseif($connection instanceof \Bitrix\Main\DB\MssqlConnection)
{
if(count($insertItems) > 1)
{
$valueData = array();
foreach($insertItems as $item)
{
$typeSql = $sqlHelper->forSql($item['type']);
$valueSql = $sqlHelper->forSql($item['value']);
$valueData[] = "SELECT {$entityTypeID}, {$entityID}, '{$typeSql}', '{$valueSql}'";
}
$valuesSql = implode(' UNION ALL ', $valueData);
if($valuesSql !== '')
{
$connection->queryExecute(
"INSERT INTO b_crm_dp_comm_mcd(ENTITY_TYPE_ID, ENTITY_ID, TYPE, VALUE) {$valuesSql}"
);
}
}
else
{
$item = $insertItems[0];
$typeSql = $sqlHelper->forSql($item['type']);
$valueSql = $sqlHelper->forSql($item['value']);
$valuesSql = "({$entityTypeID}, {$entityID}, '{$typeSql}', '{$valueSql}')";
$connection->queryExecute(
"INSERT INTO b_crm_dp_comm_mcd(ENTITY_TYPE_ID, ENTITY_ID, TYPE, VALUE) VALUES {$valuesSql}"
);
}
}
elseif($connection instanceof \Bitrix\Main\DB\OracleConnection)
{
if(count($insertItems) > 1)
{
$valueData = array();
foreach($insertItems as $item)
{
$typeSql = $sqlHelper->forSql($item['type']);
$valueSql = $sqlHelper->forSql($item['value']);
$valueData[] = "SELECT {$entityTypeID}, {$entityID}, '{$typeSql}', '{$valueSql}' FROM dual";
}
$valuesSql = implode(' UNION ALL ', $valueData);
$connection->queryExecute(
"INSERT INTO b_crm_dp_comm_mcd(ENTITY_TYPE_ID, ENTITY_ID, TYPE, VALUE) {$valuesSql}"
);
}
else
{
$item = $insertItems[0];
$typeSql = $sqlHelper->forSql($item['type']);
$valueSql = $sqlHelper->forSql($item['value']);
$valuesSql = "({$entityTypeID}, {$entityID}, '{$typeSql}', '{$valueSql}')";
$connection->queryExecute(
"INSERT INTO b_crm_dp_comm_mcd(ENTITY_TYPE_ID, ENTITY_ID, TYPE, VALUE) VALUES {$valuesSql}"
);
}
}
else
{
$dbType = $connection->getType();
throw new Main\NotSupportedException("The '{$dbType}' is not supported in current context");
}
}
}