Laravel的paginator搞砸了查询结果

时间:2016-08-12 11:23:18

标签: php laravel

我对Laravel的5.2分页符的奇怪行为有疑问: 使用查询构建器我进行了数据库查询并尝试对结果进行分页。

如果我查看查询结果,我会看到这一点(我只留下了一些记录):query builder result

好的,让我们尝试对其进行分页:pagination result

我们可以看到订单混乱并且有一些重复的项目。 如果我尝试使用simplePaginate(12)方法而不是paginate(12),则结果与预期一致。

您如何看待这种行为?如何解决这个问题呢?感谢。

UPD:添加了代码示例:

public static function getForCategoryPage($cityAlias, $categoryAlias, ParameterBag $params = null)
    {
        $appendsParams = [];
        $builder = DB::table('partners')
            ->join('cities', 'cities.id', '=', 'partners.city_id')
            ->join('categories', 'categories.id', '=', 'partners.category_id')
            ->join('comments', 'comments.partner_id', '=', 'partners.id', 'full outer')
            ->select([
                'partners.id', 'partners.name', 'categories.alias as category', 'categories.name as categoryname',
                'partners.alias', 'partners.body', 'partners.logo', DB::raw('AVG(comments.value) as rating'),
                'partners.updated_at as update_date'
            ])
            ->where([
                ['cities.alias', $cityAlias],
                ['categories.alias', $categoryAlias],
                ['partners.published', true]
            ])
            ->groupBy([
                'partners.id', 'cities.alias', 'categories.alias', 'categories.name'
            ])
            ->orderBy('pro', 'desc');
        /* Фильтры: */
        //Если есть параметр 'Наличие фотографий', подсоеденить таблицу изображений
        if ($params->has('photos') and $params->get('photos') === 'on') {
            $builder->join('images', 'partners.id', '=', 'images.gallery_id', 'inner');
            $builder->orderBy('pro', 'desc');
            $appendsParams['photos'] = 'on';
        }
        //Если есть параметр 'Наличие скидок', подсоеденить таблицу с акциями
        if ($params->has('discounts') and $params->get('discounts') === 'on') {
            $builder->join('promo', 'promo.partner_id', '=', 'partners.id', 'inner');
            $builder->orderBy('pro', 'desc');
            $appendsParams['discounts'] = 'on';
        }

        /* Сортировки: */
        if ($params->has('orderby')) {
            switch ($params->get('orderby')) {
                //По рейтингу
                case 'rating':
                    $builder->orderByRaw(DB::raw('rating desc nulls last'));
                    $appendsParams['orderby'] = 'rating';
                    break;
                //По дате добавления
                case 'date':
                    $builder->orderByRaw(DB::raw('update_date desc nulls last'));
                    $appendsParams['orderby'] = 'date';
                    break;
            }
        }

        dd($builder->paginate(12)->appends($appendsParams)->keyBy('id'));
        //return $builder->paginate(12)->appends($appendsParams);
    }

0 个答案:

没有答案