Есть ли веская причина использовать замыкание вместо цикла 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, в то время как подход замыкания будет немного понятнее, когда вы поймете фильтрацию с замыканиями. Фильтрация с замыканием в любом случае более "современная".