view-components / grids

MIT License
86 stars 17 forks source link

Error while paging and ordering data #33

Closed crackper closed 7 years ago

crackper commented 7 years ago

Hello, I have a problem when using "EloquentDataProvider" and paginate the data and try to sort some of the fields, the query is generated by grouping the data by the field I try to order, my code is as follows:

   $query = (new User)->query();
    $provider = new EloquentDataProvider($query);
    $input = new InputSource($_GET);

    $grid = new Grid($provider,
        [
            new TableCaption("Usuarios"),
            new Column('id','ID'),
            new Column('name','Nombre'),
            new Column('email', 'E-Mail'),
            new Column('created_at'),
            new Column('updated_at'),
            new PaginationControl($input->option('page', 1), 10),
            new PageSizeSelectControl($input('ps', 10), [10, 20,30,40 ,50, 100]),
            new ColumnSortingControl('name', $input->option('sort')),
            new ColumnSortingControl('email', $input->option('sort')),
            new ColumnSortingControl('created_at', $input->option('sort')),
            new ColumnSortingControl('updated_at', $input->option('sort')),
            new FilterControl('name', FilterOperation::OPERATOR_STR_CONTAINS, $input->option('name')),
            new PageTotalsRow([
                'id' => function(){
                    return 'Total de Páginas';
                },
                'name' => PageTotalsRow::OPERATION_IGNORE
            ]),
            new ResetButton()
        ]);

    $customization = new BootstrapStyling();
    $customization->apply($grid);

    return view('usuarios::index')->with('grid',$grid->render());

Displays the following error:

QueryException in Connection.php line 647: SQLSTATE[42803]: Grouping error: 7 ERROR: column "users.email" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: ...sers" where "users"."deleted_at" is null order by "email" as... ^ (SQL: select count(*) as aggregate from "users" where "users"."deleted_at" is null order by "email" asc)

in Connection.php line 647
at Connection->runQueryCallback('select count(*) as aggregate from "users" where "users"."deleted_at" is null order by "email" asc', array(), object(Closure)) in Connection.php line 607
at Connection->run('select count(*) as aggregate from "users" where "users"."deleted_at" is null order by "email" asc', array(), object(Closure)) in Connection.php line 326
at Connection->select('select count(*) as aggregate from "users" where "users"."deleted_at" is null order by "email" asc', array(), true) in Builder.php line 1718
at Builder->runSelect() in Builder.php line 1703
at Builder->get(array('*')) in Builder.php line 2094
at Builder->aggregate('count', array('*')) in Builder.php line 2022
at Builder->count() in Builder.php line 1319
at Builder->__call('count', array()) in EloquentProcessingService.php line 47
at EloquentProcessingService->count() in AbstractDataProvider.php line 18
at AbstractDataProvider->count() in PaginationControl.php line 108
at PaginationControl->getTotalRecordsCount() in PaginationControl.php line 118
at PaginationControl->getPageCount() in PaginationControl.php line 174
at PaginationControl->setViewData() in PaginationControl.php line 186
at PaginationControl->render() in RenderChildrenTrait.php line 21
at Tag->renderChildren() in Tag.php line 67
at Tag->render() in RenderChildrenTrait.php line 21
at ViewAggregate->renderChildren() in ViewAggregate.php line 66
at ViewAggregate->render() in RenderChildrenTrait.php line 21
at Compound->renderChildren() in Compound.php line 83
at Compound->render() in ManagedList.php line 217
at ManagedList->render() in UsuariosController.php line 107
at UsuariosController->index()
at call_user_func_array(array(object(UsuariosController), 'index'), array()) in Controller.php line 55
at Controller->callAction('index', array()) in ControllerDispatcher.php line 44
at ControllerDispatcher->dispatch(object(Route), object(UsuariosController), 'index') in Route.php line 203
at Route->runController() in Route.php line 160
at Route->run() in Router.php line 559
at Router->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 30
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in SubstituteBindings.php line 41
at SubstituteBindings->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in VerifyCsrfToken.php line 65
at VerifyCsrfToken->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ShareErrorsFromSession.php line 49
at ShareErrorsFromSession->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in StartSession.php line 64
at StartSession->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in EncryptCookies.php line 59
at EncryptCookies->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Router.php line 561
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 520
at Router->dispatchToRoute(object(Request)) in Router.php line 498
at Router->dispatch(object(Request)) in Kernel.php line 174
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) in Pipeline.php line 30
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Debugbar.php line 51
at Debugbar->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in TransformsRequest.php line 30
at TransformsRequest->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in TransformsRequest.php line 30
at TransformsRequest->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in ValidatePostSize.php line 27
at ValidatePostSize->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 46
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in Pipeline.php line 148
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Kernel.php line 149
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 116
at Kernel->handle(object(Request)) in index.php line 53
at require_once('/Users/Samuel/PhpstormProjects/HexagonSuport/public/index.php') in server.php line 21
satmanager commented 7 years ago

Hi, i have similar issue when im trying to sort any field. i'm using laravel 5.3 and my DB is on PostgreSQL over the homestead enviroment. Thank you for your help.

Error:

Method ViewComponents\Grids\Grid::__toString() must not throw an exception, caught Illuminate\Database\QueryException: SQLSTATE[42803]: Grouping error: 7 ERROR: column "users.name" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: ...elect count() as aggregate from "users" order by "name" des... ^ (SQL: select count() as aggregate from "users" order by "name" desc)

`

in 7217462b7c511a3df5bf1632028edc807ada5edd.php line 0
at FatalErrorException->__construct() in HandleExceptions.php line 132
at HandleExceptions->fatalExceptionFromError() in HandleExceptions.php line 118
at HandleExceptions->handleShutdown() in HandleExceptions.php line 0
in PhpEngine.php line 42
at PhpEngine->evaluatePath() in CompilerEngine.php line 59
at CompilerEngine->get() in View.php line 149
at View->getContents() in View.php line 120
at View->renderContents() in View.php line 85
at View->render() in Response.php line 45
at Response->setContent() in Response.php line 201
at Response->__construct() in Router.php line 1028
at Router->prepareResponse() in Router.php line 653
at Router->Illuminate\Routing\{closure}() in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}() in SubstituteBindings.php line 41
at SubstituteBindings->handle() in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}() in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}() in Authenticate.php line 43
at Authenticate->handle() in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}() in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}() in VerifyCsrfToken.php line 65
at VerifyCsrfToken->handle() in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}() in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}() in ShareErrorsFromSession.php line 49
at ShareErrorsFromSession->handle() in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}() in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}() in StartSession.php line 64
at StartSession->handle() in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}() in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}() in AddQueuedCookiesToResponse.php line 37
at AddQueuedCookiesToResponse->handle() in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}() in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}() in EncryptCookies.php line 59
at EncryptCookies->handle() in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}() in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}() in Pipeline.php line 104
at Pipeline->then() in Router.php line 655
at Router->runRouteWithinStack() in Router.php line 629
at Router->dispatchToRoute() in Router.php line 607
at Router->dispatch() in Kernel.php line 268
at Kernel->Illuminate\Foundation\Http\{closure}() in Pipeline.php line 53
at Pipeline->Illuminate\Routing\{closure}() in Debugbar.php line 51
at Debugbar->handle() in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}() in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}() in CheckForMaintenanceMode.php line 46
at CheckForMaintenanceMode->handle() in Pipeline.php line 137
at Pipeline->Illuminate\Pipeline\{closure}() in Pipeline.php line 33
at Pipeline->Illuminate\Routing\{closure}() in Pipeline.php line 104
at Pipeline->then() in Kernel.php line 150
at Kernel->sendRequestThroughRouter() in Kernel.php line 117
at Kernel->handle() in index.php line 53
at {main}() in index.php line 0

`

My code:

` $provider = new EloquentDataProvider((new User)->newQuery());

    $input = new InputSource($_GET);

    //create grid
    $grid = new Grid(
        $provider,
        // all components are optional, you can specify only columns
        [
            new TableCaption('My Grid'),
            new Column('id'),
            new Column('name'),
            new Column('last_name'),
            new Column('email'),
            new DetailsRow(new SymfonyVarDump()), // when clicking on data rows, details will be shown
            new PaginationControl($input->option('page', 1), 5), // 1 - default page, 5 -- page size
            new PageSizeSelectControl($input->option('page_size', 5), [2, 5, 10]), // allows to select page size
            new ColumnSortingControl('id', $input->option('sort')),
            new ColumnSortingControl('name', $input->option('sort')),
            new FilterControl('name', FilterOperation::OPERATOR_LIKE, $input->option('name')),
            new CsvExport($input->option('csv')), // yep, that's so simple, you have CSV export now
            //new PageTotalsRow([
            //    'id' => PageTotalsRow::OPERATION_IGNORE
            //])
        ]
    );

    $customization = new BootstrapStyling();
    $customization->apply($grid);`
Nayjest commented 7 years ago

Hi! Looks like it's same issue: https://github.com/view-components/view-components/issues/33

Nayjest commented 7 years ago

What version of view-components/view-components is used in your app? Issue #33 was fixed in v0.26.6

Nayjest commented 7 years ago

Please give me know if update to view-components/view-components v0.26.6 not helped.

crackper commented 7 years ago

Hello my version is: "view-components/grids": "^0.5.8" , "view-components/eloquent-data-processing": "^1.2" and Laravel 5.4

Nayjest commented 7 years ago

It uses view-components/view-components package, what is version of view-components/view-components in composer.lock file inside your project?

crackper commented 7 years ago

Contains this version: { "name": "view-components/eloquent-data-processing", "version": "v1.2.3", "source": { "type": "git", "url": "https://github.com/view-components/eloquent-data-processing.git", "reference": "e121bb97c4dba7e01ef25bdff5233672acbfe59b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/view-components/eloquent-data-processing/zipball/e121bb97c4dba7e01ef25bdff5233672acbfe59b", "reference": "e121bb97c4dba7e01ef25bdff5233672acbfe59b", "shasum": "" }, "require": { "php": "^5.5||^7", "view-components/view-components": "^0.24.2||^0.25" }, "require-dev": { "illuminate/database": "*", "view-components/testing-helpers": "^2.0.1" }, "type": "library", "autoload": { "psr-4": { "ViewComponents\Eloquent\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Vitalii [Nayjest] Stepanenko", "email": "mail@vitaliy.in", "role": "Developer" } ], "description": "Eloquent ORM support for ViewComponents", "homepage": "https://github.com/view-components/eloquent-data-processing", "keywords": [ "laravel", "laravel-4", "laravel-5", "laravel4", "laravel5" ], "time": "2016-08-31 17:19:41" }

Thanks...

Nayjest commented 7 years ago

Yep, you need to update view-components/view-components to v0.26.6 I published new releases of grids & eloquent-data-processing, it should work with view-components v0.26.6 now.