我正在使用Laravel 4;有问题的模型扩展Eloquent
。
我在两个模型listing
和photo
之间建立了关系。我正在编译一个没有任何相应listings
的{{1}}集合。 Eloquent有一种方便的方法来查找 DO 有相关记录的记录:
photos
我不知道$listings = Listing::has('photos')->get();
方法的倒数的存在。 如果有,请告诉我。
无论如何,这就是我解决问题的方法:
has
这很好用,但我正在努力扩展我的知识。阅读Laravel documentation on collections,有一个过滤集合的例子:
// 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]);
}
}
我使用这种方法重写了$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;
}
});
对象在两种情况下都是相同的。是否有任何令人信服的理由选择一种方法而不是另一种方法,或者仅仅是个人偏好的问题?
答案 0 :(得分:1)
两者之间的选择取决于个人偏好。
无论如何都有一些评论:
如果向后兼容性存在问题,请不要使用闭包。它们是PHP 5.3语言结构。不过,现在这不应该是一个问题了。
唯一可以发挥重要作用的是性能。但是for loops are more or less equally fast as closures in PHP。如果性能确实成为问题,您应该完全改变方法,并且首先只获取正确的记录。
至于可读性:对于没有经验的PHP程序员来说,for循环方法会更容易理解,而一旦你理解了使用闭包的过滤,闭包方法会更清晰一些。无论如何,用封盖过滤更“现代”。