2014-02-19 62 views
2

我正在使用Laravel 4;有問題的車型延伸Eloquent在這種情況下,是否有充分的理由使用閉包而不是for循環?

我有兩個型號,listingphoto之間的關係。我正在編譯listings的集合,它們沒有任何對應的photos。雄辯有發現DO有相關記錄的記錄一個方便的方法:

$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 documentation on collections,有濾波的集合的例子:

$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 loops are more or less equally fast as closures in PHP。如果性能確實成爲問題,那麼您應該完全改變方法,並且只能首先獲取正確的記錄。

至於可讀性:for循環的做法會更容易理解雛PHP程序員,而封閉的做法是更清楚一點,一旦你瞭解閉包過濾。無論如何,用閉包過濾更「現代」。

相關問題