Есть ли веская причина использовать замыкание вместо цикла for в этом случае?

Я использую Laravel 4; рассматриваемые модели расширяются Eloquent,

У меня есть отношения между двумя моделями, listing а также photo, Я собираю коллекцию listings которые не имеют никакого соответствующего photos, Eloquent имеет удобный метод для поиска записей, которые имеют связанные записи:

$listings = Listing::has('photos')->get();

Я не знаю о существовании обратного has метод. Если есть, пожалуйста, дайте мне знать.

Во всяком случае, вот как я решил проблему:

// fetch all the listings, eagerly loading the photos relationship
$listings = Listing::with('photos')->get();

foreach ($listings as $key => $listing)
{
    // if the listing has photos, remove it from the collection
    if (count($listing->photos) != 0)
    {
        unset($listings[$key]);
    }
}

Это работает просто отлично, но я пытаюсь расширить свои знания. Читая документацию Laravel по коллекциям, есть пример фильтрации коллекций:

$users = $users->filter(function($user)
{
    if($user->isAdmin())
    {
        return $user;
    }
});

Я переписал свой for цикл с использованием этого метода:

$listings = $listings->filter(function($listing)
{
    // Keep listings with no photos
    if (count($listing->photos) == 0)
    {
        return $listing;
    }
});

Результирующий $listings Объект идентичен в обоих случаях. Есть ли веская причина для выбора одного метода перед другим, или это просто вопрос личных предпочтений?

1 ответ

Решение

Выбор между ними зависит от личных предпочтений.

В любом случае, некоторые замечания:

Если проблема заключается в обратной совместимости, не используйте замыкания. Это языковая конструкция PHP 5.3. Однако в наши дни это больше не должно быть проблемой.

Единственное, что может сыграть значительную роль, это производительность. Но циклы for более или менее одинаково быстры, как замыкания в PHP. И если производительность действительно становится проблемой, вы должны полностью изменить метод и в первую очередь получать только нужные записи.

Что касается читабельности: подход for loop будет легче понять неопытным программистам PHP, в то время как подход замыкания будет немного понятнее, когда вы поймете фильтрацию с замыканиями. Фильтрация с замыканием в любом случае более "современная".

Другие вопросы по тегам