- Модуль: 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);
}