• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/lib/internals/mailcontact.php
  • Класс: BitrixMailInternalsMailContactTable
  • Вызов: MailContactTable::addContactsBatch
static function addContactsBatch($contactsData)
{
	if (empty($contactsData))
	{
		return true;
	}

	$contactsToCheck = [];
	foreach ($contactsData as $index => $item)
	{
		$item['EMAIL'] = trim($item['EMAIL']);
		$contactsToCheck[$item['USER_ID']][] = $item;
	}

	$alreadyAdded = [];

	foreach ($contactsToCheck as $userId => $items)
	{
		$alreadyAdded = static::query()
			->addSelect('EMAIL', 'EMAIL')
			->addSelect('ID', 'ID')
			->addSelect('NAME', 'NAME')
			->where('USER_ID', $userId)
			->whereIn('EMAIL', array_column($items, 'EMAIL'))
			->exec()
			->fetchAll();

		$alreadyAddedEmail = array_column($alreadyAdded, 'EMAIL');

		foreach ($items as $item)
		{
			if (!in_array($item['EMAIL'], $alreadyAddedEmail, true))
			{
				$contactsToAdd[$item['EMAIL']] = $item;
			}
		}
	}

	if (empty($contactsToAdd))
	{
		return $alreadyAdded;
	}

	$sqlHelper = Application::getConnection()->getSqlHelper();
	$values = [];
	foreach ($contactsToAdd as $item)
	{
		$item = [
			'USER_ID' => intval($item['USER_ID']),
			'NAME' => "'" . $sqlHelper->forSql(trim($item['NAME'])) . "'",
			'ICON' => "'" . $sqlHelper->forSql(serialize($item['ICON'])) . "'",
			'EMAIL' => "'" . $sqlHelper->forSql(trim($item['EMAIL'])) . "'",
			'ADDED_FROM' => "'" . $sqlHelper->forSql($item['ADDED_FROM']) . "'",
		];
		$values[] = implode(", ", $item);
	}
	$keys = implode(', ', array_keys(reset($contactsToAdd)));
	$values = implode('), (', $values);

	$tableName = static::getTableName();
	$sql = $sqlHelper->getInsertIgnore($tableName, "($keys)", " VALUES($values)");
	Application::getConnection()->query($sql);

	return true;
}