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


Getting distinct rows from paginated result set in Laravel

我为产品分类/列表创建了以下内容:

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);

groupBy 方法不仅存在于查询生成器上,还存在于集合类中。 (调用分页时将返回)

看看 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函数......

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

更新 2

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

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

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