yajra / laravel-datatables

jQuery DataTables API for Laravel
https://yajrabox.com/docs/laravel-datatables
MIT License
4.75k stars 861 forks source link

Upgrade to 9 and ajax stop working #3145

Closed franciscoarnaldog closed 4 months ago

franciscoarnaldog commented 4 months ago

Summary of problem or feature request

After upgrade a legacy project from Laravel 5.4 to 8 (cuz php 7.4) the datatables ajax route stop working. It's hitted but never return recv() failed (104: Connection reset by peer) while reading response header from upstream on my local nginx

The ajax request doesn't return any value and timeout. DataTables warning: table id=principalsTable - Ajax error. For more information about this error, please see http://datatables.net/tn/7

Code snippet of problem

js:

var table = $('#principalsTable')
            .DataTable( {
                processing: true,
                serverSide: true,
                ajax: {
                                    url: '{!! url("principals-dt") !!}',
                              ...

route: Route::get('principals-dt', 'PrincipalsController@getDataTable');

controller:

    public function getDataTable(Request $request)
        {
            l(__METHOD__, __LINE__, "getDataTable: " . json_encode($_GET));
            if ($request->ajax()) {
                $query = Principal::with(
                    'user',
                    'rubro',
                    ...
                )
                ->select('principals.*');

                return Datatables::eloquent($query)
                    ->editColumn('id', function (Principal $p) {
                        return '<a href="' . url('/') . '/principals/' . $p->id . '">' . $p->id . '</a>';
                    })
                    ...
                    ->rawColumns(['id', ...])
                    ->make(true);
            }else
                l(__METHOD__, __LINE__, "getDataTable: no es ajax");
    }

System details

The ajax stop working in the legacy server (Apache) and in my machine (nginx).

yajra commented 4 months ago

Does it pass this code if ($request->ajax()) {? This is Laravel framework built-in function.

franciscoarnaldog commented 4 months ago

yes, the return Datatables hangs up. Dunno why, was working after the migration.

yajra commented 4 months ago

The code looks fine, any error dump?

franciscoarnaldog commented 4 months ago

Nop nothing. Was expecting an exception in logs but none.

yajra commented 4 months ago

Have you tried checking apache/nginx error logs?

franciscoarnaldog commented 4 months ago

nginx says connect reset by peer

2024/05/23 13:04:15 [error] 44652#44652: *65 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 127.0.0.1, server: xxx.local, request: "GET /principals-dt?draw=2&columns%5B0%5D%5Bdata%5D=id&columns%5B0%5D%5Bname%5D=principals.id&columns%5B1%5D%5Bdata%5D=ingreso_id&columns%5B1%5D%5Bname%5D=principals.ingreso_id&columns%5B2%5D%5Bdata%5D=fecha_factura&columns%5B2%5D%5Bname%5D=principals.fecha_factura&columns%5B3%5D%5Bdata%5D=fecha_vto_pago&columns%5B3%5D%5Bname%5D=principals.fecha_vto_pago&columns%5B4%5D%5Bdata%5D=tipo_comprobante&columns%5B4%5D%5Bname%5D=principals.tipo_comprobante&columns%5B5%5D%5Bdata%5D=nro_comprobante&columns%5B5%5D%5Bname%5D=principals.nro_comprobante&columns%5B6%5D%5Bdata%5D=rubro.nombre&columns%5B6%5D%5Bname%5D=&columns%5B7%5D%5Bdata%5D=rubro.tipo_costo&columns%5B7%5D%5Bname%5D=&columns%5B8%5D%5Bdata%5D=proveedor.nombre&columns%5B8%5D%5Bname%5D=&columns%5B9%5D%5Bdata%5D=vehiculo.id&columns%5B9%5D%5Bname%5D=&columns%5B10%5D%5Bdata%5D=vehiculo_ptj&columns%5B10%5D%5Bname%5D=&columns%5B11%5D%5Bdata%5D=detalle&columns%5B11%5D%5Bname%5D=principals.detalle&columns%5B12%5D%5Bdata%5D=importe_neto_cf&columns%5B12%5D%5Bname%5D=principals.importe_neto_cf&columns%5B13%5D%5Bdata%5D=importe_costo_imp&columns%5B13%5D%5Bname%5D=principals.importe_costo_imp&columns%5B14%5D%5Bdata%5D=importe_impue_cf&columns%5B14%5D%5Bname%5D=principals.importe_impue_cf&columns%5B15%5D%5Bdata%5D=importe_seguro_cf&columns%5B15%5D%5Bname%5D=principals.importe_seguro_cf&columns%5B16%5D%5Bdata%5D=importe_prorrateado_2_cf&columns%5B16%5D%5Bname%5D=principals.importe_prorrateado_2_cf&columns%5B17%5D%5Bdata%5D=importe_desc_cf&columns%5B17%5D%5Bname%5D=principals.importe_desc_cf&columns%5B18%5D%5Bdata%5D=importe_costo_cf&columns%5B18%5D%5Bname%5D=principals.importe_costo_cf&columns%5B19%5D%5Bdata%5D=importe_final_cf&columns%5B19%5D%5Bname%5D=principals.importe_final_cf&columns%5B20%5D%5Bdata%5D=fecha_gasto&columns%5B20%5D%5Bname%5D=principals.fecha_gasto&columns%5B21%5D%5Bdata%5
franciscoarnaldog commented 4 months ago

image

[2024-05-24 13:56:35] production.DEBUG:        127.0.0.1 @ Admin               : Yajra\DataTables\DataTables::eloquent(00000119): {}  
[2024-05-24 13:56:36] production.DEBUG:        127.0.0.1 @ Admin               : Yajra\DataTables\DataTables::eloquent(00000119): {}  
yajra commented 4 months ago

Might be an issue in the config? Try deleting all existing datatables config if any.

franciscoarnaldog commented 4 months ago

Sorry for the delay, it seems that it was a circular table reference, I commented Company and it worked!... I thought I had already tried this but without luck... after correcting discrepancies between branches, I checked the references one by one and identified which one was causing problems... apologies.

...
public function indexDataTables() //Request $request)
    {
        $this->authorize('index', Principal::class);

        $query = Principal::with(
            'user',
            'rubro',
            'proveedor',
                        'vehiculo',
            'sucursal',
            // 'empresa', // << circular reference.
            'unidad_operativa',
            'centro_costo',
            'origen_gasto',
            'importacion',
            'prorrateo2'
        )
        // ->select('principals.*')
                ->orderBy('updated_at', 'DESC');

        return DataTables::eloquent($query)
            ->editColumn('id', function (Principal $p) {
                return '<a href="' . url('/') . '/principals/' . $p->id . '">' . $p->id . '</a>';
            })
                        ...
yajra commented 4 months ago

Glad you figured it out, Thanks!