2014-07-26 287 views
0

試圖根據多個值的任意組合過濾集合對象。這是我所知道的。沒有發生。任何線索對我來說?過濾Eloquent集合

public function search() 
{ 
    $posts = Posting::all(); 

    $type_id = Input::get('type_id'); 
    $country_id = Input::get('country_id'); 
    $province_id = Input::get('province_id'); 

    $posts = $posts->filter(function($post) 
    { 
     if(!empty($type_id) && $type_id>0) 
     { 
     return $post->where('type_id','=',$type_id); 
    } 
    })->values(); 

    $posts = $posts->filter(function($post) 
    { 
     if(!empty($country_id) && $country_id>0) 
     { 
     return $post->where('country_id','=',$country_id); 
     } 
    })->values(); 

    $posts = $posts->filter(function($post) 
    { 
     if(!empty($province_id) && $province_id>0) 
     { 
     return $post->where('province_id','=',$province_id); 
     } 
    })->values(); 

    return $posts; 
} 

讚賞任何幫助。

+0

你能顯示什麼Input :: all()返回? – Jazerix

+0

宣佈$ post在哪裏?你確定你在返回結果時不是指$ post? – Jazerix

+0

$ post是關閉參數的名稱:'$ posts = $ posts-> filter(function($ post)'。 – RSAdmin

回答

0

首先,你應該確認id大於0,如果提供的話。你不應該手動檢查。

但無論如何,你爲什麼要使用過濾器,當你可以直接使用佞(我省略了ID爲大於0的檢查):

$type_id  = Input::get('type_id'); 
$country_id = Input::get('country_id'); 
$province_id = Input::get('province_id'); 

$query = Posting::query(); 

if (! empty($type_id))  $query->whereTypeId($type_id); 

if (! empty($country_id)) $query->whereCountryId($country_id); 

if (! empty($province_id)) $query->whereProvinceId($province_id); 

return $query->get(); 
+0

當我嘗試使用此代碼modifyin g到'$ posts = $ query-> get()'$ posts的最後一行總是未定義的。哦,堅果。我的數據實際上是嵌套的:我想要過濾的字段在$ posting-> profile-> type_id等現在我該怎麼辦? $ query-> profile-> whereTypeId($ type_id)? – RSAdmin

+0

請考慮看看後續問題:http://stackoverflow.com/questions/24976917/eloquent-filtering-of-nested – RSAdmin

+0

我在其他帖子中回覆 – Kousha

0

首先,你需要返回這是令從封閉感的filter

$posts = $posts->filter(function($post) 
{ 
    if(!empty($type_id) && $type_id>0) 
    { 
    return $post->where('type_id','=',$type_id); 
    } 
}) 

以上的回報Eloquent\Builder對象,進行評估,以true,所以..它真的沒有意義。

這是你所需要的:

$posts = $posts->filter(function($post) 
{ 
    if(!empty($type_id) && $type_id>0) 
    { 
    return $post->type_id == $type_id; // bool 
    } 
}) 

有了這樣的代碼,你將過濾收集。 $posts現在將只保存那些符合該封閉語句的項目。