• Модуль: mail
  • Путь к файлу: ~/bitrix/modules/mail/lib/mailmessageuid.php
  • Класс: BitrixMailMailMessageUidTable
  • Вызов: MailMessageUidTable::selectMessagesToBeDeleted
static function selectMessagesToBeDeleted($fields, $filter, array $eventData, $limit = false): array
{
	$result = array();

	$primary = array('ID', 'MAILBOX_ID');

	$eventData = array_values($eventData);

	if (empty($eventData))
	{
		$select = $fields;
	}
	else
	{
		$select = array_diff($fields, array_intersect($fields, ...array_map('array_keys', $eventData)));

		if (empty($select))
		{
			return $eventData;
		}

		if (array_diff($primary, array_intersect($primary, ...array_map('array_keys', $eventData))))
		{
			$select = $fields;
		}
		else
		{
			foreach ($eventData as $item)
			{
				$key = sprintf('%u:%s', $item['MAILBOX_ID'], $item['ID']);
				$result[$key] = $item;
			}
		}
	}

	$select = array_unique(array_merge($primary, $select));

	$mailsFilter = $filter;
	$mailsFilter['==IS_IN_QUEUE'] = false;
	$queueSubquery = MessageUploadQueueTable::query();
	$queueSubquery->addFilter('=ID', new BitrixMainDBSqlExpression('%s'));
	$queueSubquery->addFilter('=MAILBOX_ID', new BitrixMainDBSqlExpression('%s'));
	$emailsForDeleteQuery = MailMessageUidTable::query()
		->registerRuntimeField(new EntityExpressionField(
			'IS_IN_QUEUE',
			sprintf('EXISTS(%s)', $queueSubquery->getQuery()),
			['ID', 'MAILBOX_ID']
		))
		->setFilter($mailsFilter);

	if($limit !== false)
	{
		$emailsForDeleteQuery->setLimit($limit);
	}

	foreach ($select as $index => $selectingField)
	{
		if (strncmp('MAILBOX_', $selectingField, 8) === 0 && !MailMessageUidTable::getEntity()->hasField($selectingField))
		{
			$emailsForDeleteQuery->addSelect('MAILBOX.'.mb_substr($selectingField, 8), $selectingField);
			continue;
		}
		$emailsForDeleteQuery->addSelect($selectingField);
	}

	$res = $emailsForDeleteQuery->exec();
	while ($item = $res->fetch())
	{
		$key = sprintf('%u:%s', $item['MAILBOX_ID'], $item['ID']);
		$result[$key] = array_merge((array) $result[$key], $item);
	}

	return array_values($result);
}