2

我正在使用 Laravel 4;有问题的模型扩展Eloquent

我在两个模型之间建立了关系,listing并且photo. 我正在编译一个listings没有任何对应的集合photosEloquent有一种方便的方法来查找具有相关记录的记录:

$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对象在两种情况下都是相同的。是否有任何令人信服的理由选择一种方法而不是另一种方法,或者仅仅是个人喜好问题?

4

1 回答 1

1

两者之间的选择是个人喜好问题。

无论如何,一些评论:

如果向后兼容性是一个问题,那么不要使用闭包。它们是 PHP 5.3 语言结构。然而,这些天来这应该不再是问题了。

唯一可以发挥重要作用的另一件事是性能。但是for 循环或多或少与 PHP 中的闭包一样快。如果性能确实成为问题,您应该完全改变方法,首先只获取正确的记录。

至于可读性:对于没有经验的 PHP 程序员来说,for 循环方法会更容易理解,而一旦您了解了使用闭包进行过滤,闭包方法就会更加清晰。无论如何,使用闭包进行过滤更“现代”。

于 2014-02-25T18:32:10.400 回答