过滤Eloquent Collection

时间:2014-07-26 22:11:18

标签: laravel filtering 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;
}

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:0)

首先,如果提供了大于0的id,您应该对其进行验证。你不应该手动检查出来。

但无论如何,你为什么要使用过滤器,当你可以直接使用Eloquent时(我省略了检查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();

答案 1 :(得分: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现在只保留那些与该闭包中的语句匹配的项目。