从Laravel中的分页结果集中获取不同的行

时间:2014-11-22 18:48:24

标签: php laravel laravel-4

我为产品catelog / lister创建了以下内容:

public function index($type_id = null) {
    $filters = $sort = array();
    if (isset($type_id)) {
        $filters['type'] = $type_id;
    } else {
        $filters['type'] = Input::get('type');
    }
    $filters['search'] = Input::get('search');
    $filters['brand'] = Input::get('brand');

    $sort['sort'] = Input::get('sort');
    $sort['sortdir'] = Input::get('dir');

    $productsPaginated = $this->fetchProducts($filters, $sort);

    return View::make('products.products', array(
                'productsList' => $productsPaginated
                    )
    );
}

public function fetchProducts($filters, $sorts, $perpage = 2) {
    print_r($filters);
    $Product = Product::query();
    if (!empty($filters['search']))
        $Product->where('name', 'LIKE', '%' . $filters['search'] . '%');
    if (isset($filters['type']))
        $Product->where('type_id', $filters['type']);
    if (isset($filters['brand']))
        $Product->where('brand_id', $filters['brand']);

    if (isset($sorts['sort']))
        $Product->orderBy($sorts['sort'], $sorts['sortdir']);

    $Product = $Product->paginate($perpage);
    return $Product;
}

到目前为止效果很好。

我现在正在尝试创建一些过滤器,以便用户可以进一步过滤结果。

如何根据以下列中的列访问和确定不同的行:

$productsPaginated = $this->fetchProducts($filters, $sort);

1 个答案:

答案 0 :(得分:0)

groupBy方法不仅存在于查询构建器上,还存在于集合类中。 (调用paginate时会返回)

查看source on github

所以在你的函数中添加一个参数并使用groupBy

public function fetchProducts($filters, $sorts, $perpage = 2, $groupBy = null) {
// code omitted for brevity
    $Product = $Product->paginate($perpage);
    if($groupBy){
        $Product = $Product->groupBy($groupBy);
    }
    return $Product;
}

更新

那么lists function适用于集合以及查询构建器......

$Product->lists('column-name');

更新2

我很好奇,所以我做了一些测试,发现了一些非常奇怪的东西,我不知道它是一个错误或一个我不明白的功能

当调用groupBy时,返回的集合实际上只有一个项目(索引""),并且此项目包含"原始"的数组。项目。所以让lists工作。我发现了这个解决方法

$Product = $Product->groupBy($groupBy);
$Product = new Collection($Product[""]); // \Illuminate\Support\Collection
$Product = $Product->lists('column-name');