А что Вы в ней хотите усовершенствовать?
Ну например можно добавить typehint array у $requestTags и избавиться от проверки:
public static function getTags(array $requestTags): array
{
$tags = [];
foreach ($requestTags as $tag) {
if (is_numeric($tag)) {
$tags[] = $tag;
} else {
$newTag = Tag::upsert(['name' => $tag]);
$tags[] = $newTag->id;
}
}
return $tags;
}
Либо можно вынести в отдельную функицю сохранение тегов, например:
function mapTags( array &$value )
{
if ( is_numeric($value) )
{
return $value;
}
$newTag = Tag::upsert(['name' => $tag]);
return $newTag->id;
}
И тогда весь код метода свернется в:
public static function getTags( array $requestTags ): array
{
return array_map('mapTags', $requestTags);
}
Можно просто уменьшить вложенность оставив скрипт (меньше уровней будет):
public static function getTags($requestTags): array
{
$tags = [];
if ( !$requestTags )
{
return $tags;
}
foreach ($requestTags as $tag) {
if (is_numeric($tag)) {
$tags[] = $tag;
} else {
$newTag = Tag::upsert(['name' => $tag]);
$tags[] = $newTag->id;
}
}
return $tags;
}
Если это очень частовыполняемая операция, то можно сэкономить на запросах:
public static function getTags(array $requestTags): array
{
if ( empty($requestTags) )
{
return $requestTags;
}
$existedTags = array_filter($requestTags, 'is_numeric');
$newTags = array_diff($requestTags, $existedTags);
/**
* Тут единый batch-метод который отправляет
* 1 запрос на все теги сразу.
* В results - массив Tag, обработанных batch-методом
*/
foreach ($results as $tag)
{
$existedTags[] = $tag->id;
}
return array_unique($existedTags);
}