laravel-datatables icon indicating copy to clipboard operation
laravel-datatables copied to clipboard

Datatable not showing data

Open ZAZmaster opened this issue 5 years ago • 17 comments

Use Laravel 6.5.2, PHP 7.2.26 (also try 7.3.3) and "yajra/laravel-datatables": "v1.5.0" The data table appears but doesn't have any data. Model Apartment contain data.

Routes

Route::resource('apartments', 'ApartmentController')

Controller

<?php

namespace App\Http\Controllers;

use App\Apartment;
use App\DataTables\ApartmentDataTable;
use Yajra\DataTables\Services\DataTable;

class ApartmentController extends Controller
{
    public function qindex(ApartmentDataTable $dataTable)
    {
        return $dataTable->render('apartments.index');
    }
}

Datatable Service

<?php

namespace App\DataTables;

use App\Apartment;
use Illuminate\Database\Eloquent\Builder;
use Yajra\DataTables\DataTableAbstract;
use Yajra\DataTables\Html\Button;
use Yajra\DataTables\Html\Column;
use Yajra\DataTables\Html\Editor\Editor;
use Yajra\DataTables\Html\Editor\Fields;
use Yajra\DataTables\Services\DataTable;

class ApartmentDataTable extends DataTable
{

    /**
     * Build DataTable class.
     *
     * @param mixed $query Results from query() method.
     * @return DataTableAbstract
     */
    public function dataTable($query)
    {
        return datatables()
            ->eloquent($query)
            ->addColumn('action', 'apartment.action');
    }

    /**
     * Get query source of dataTable.
     *
     * @param Apartment $model
     * @return Builder
     */
    public function query(Apartment $model)
    {
        return $model->newQuery();
    }

    /**
     * Optional method if you want to use html builder.
     *
     * @return \Yajra\DataTables\Html\Builder
     */
    public function html()
    {
        return $this->builder()
                    ->setTableId('apartment-table')
                    ->columns($this->getColumns())
                    ->minifiedAjax()
                    ->dom('Bfrtip')
                    ->orderBy(1)
                    ->buttons(
                        Button::make('create'),
                        Button::make('export'),
                        Button::make('print'),
                        Button::make('reset'),
                        Button::make('reload')
                    );
    }

    /**
     * Get columns.
     *
     * @return array
     */
    protected function getColumns()
    {
        return [
            Column::computed('action')
                  ->exportable(false)
                  ->printable(false)
                  ->width(60)
                  ->addClass('text-center'),
            Column::make('id'),
            Column::make('address'),
            Column::make('created_at'),
            Column::make('updated_at'),
        ];
    }

    /**
     * Get filename for export.
     *
     * @return string
     */
    protected function filename()
    {
        return 'Apartment_' . date('YmdHis');
    }
}

View

@extends('layouts.app')

@section('content')
    <div class="container py-4">
        <div class="row justify-content-center">
            <div class="col-md-12">
                <div class="card">
                    <div class="card-header">Table</div>
                    <div class="card-body">
                        {{ $dataTable->table() }}
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
@endsection

@push('scripts')
    <script src="{{ asset('vendor/datatables/buttons.server-side.js') }}"></script>
    {{ $dataTable->scripts() }}
@endpush

Result in browser

<script type="text/javascript">
(function(window,$){window.LaravelDataTables=window.LaravelDataTables||{};window.LaravelDataTables["apartment-table"]=$("#apartment-table").DataTable({"serverSide":true,"processing":true,"ajax":{"url":"","type":"GET","data":function(data) {
            for (var i = 0, len = data.columns.length; i < len; i++) {
                if (!data.columns[i].search.value) delete data.columns[i].search;
                if (data.columns[i].searchable === true) delete data.columns[i].searchable;
                if (data.columns[i].orderable === true) delete data.columns[i].orderable;
                if (data.columns[i].data === data.columns[i].name) delete data.columns[i].name;
            }
            delete data.search.regex;}},"columns":[{"data":"action","name":"action","title":"Action","orderable":false,"searchable":false,"width":60,"className":"text-center"},{"data":"id","name":"id","title":"Id","orderable":true,"searchable":true},{"data":"address","name":"address","title":"Address","orderable":true,"searchable":true},{"data":"created_at","name":"created_at","title":"Created At","orderable":true,"searchable":true},{"data":"updated_at","name":"updated_at","title":"Updated At","orderable":true,"searchable":true}],"dom":"Bfrtip","order":[[1,"desc"]],"buttons":[{"extend":"create"},{"extend":"export"},{"extend":"print"},{"extend":"reset"},{"extend":"reload"}]});})(window,jQuery);
</script>

ZAZmaster avatar Feb 03 '20 05:02 ZAZmaster

Maybe a typo on index?

// should be index
public function qindex(ApartmentDataTable $dataTable)

yajra avatar Feb 04 '20 03:02 yajra

No.... I do this for test and accidentally copied.

ZAZmaster avatar Feb 11 '20 12:02 ZAZmaster

Your code looks fine. Any errors on console?

yajra avatar Feb 11 '20 12:02 yajra

No error anywhere...

ZAZmaster avatar Feb 11 '20 13:02 ZAZmaster

$dataTable->scripts() generate code:

<script type="text/javascript">(function(window,$){window.LaravelDataTables=window.LaravelDataTables||{};window.LaravelDataTables["apartment-table"]=$("#apartment-table").DataTable({"serverSide":true,"processing":true,"ajax":{"url":"","type":"GET","data":function(data) {
            for (var i = 0, len = data.columns.length; i < len; i++) {
                if (!data.columns[i].search.value) delete data.columns[i].search;
                if (data.columns[i].searchable === true) delete data.columns[i].searchable;
                if (data.columns[i].orderable === true) delete data.columns[i].orderable;
                if (data.columns[i].data === data.columns[i].name) delete data.columns[i].name;
            }
            delete data.search.regex;}},"columns":[{"data":"action","name":"action","title":"Action","orderable":false,"searchable":false,"width":60,"className":"text-center"},{"data":"id","name":"id","title":"Id","orderable":true,"searchable":true},{"data":"address","name":"address","title":"Address","orderable":true,"searchable":true},{"data":"created_at","name":"created_at","title":"Created At","orderable":true,"searchable":true},{"data":"updated_at","name":"updated_at","title":"Updated At","orderable":true,"searchable":true}],"dom":"Bfrtip","order":[[1,"desc"]],"buttons":[{"extend":"create"},{"extend":"export"},{"extend":"print"},{"extend":"reset"},{"extend":"reload"}]});})(window,jQuery);
</script>

If I put dd($dataTable->ajax()); in Controller before return, then has Illuminate\Http\JsonResponse with full data.

ZAZmaster avatar Feb 12 '20 04:02 ZAZmaster

First of all sorry for my english I have same problem, and find solution for me If i use @section('content') {{ $dataTable->table() }} @endsection

@push('scripts') {{ $dataTable->scripts() }} @endpush

It's doesn't work. No data/

But when i don't use @push and @scripts it's work fine. Like this

@section('content') {{ $dataTable->table() }} {{ $dataTable->scripts() }} @endsection

I don't know is this right, but this work.

In bottstrap.js i paste code like this

`try { window.Popper = require('popper.js').default; window.$ = window.jQuery = require('jquery');

require('bootstrap');
require('datatables.net-bs4');
require('datatables.net-buttons-bs4');

} catch (e) {}`

in app.blade.php

    <script src="{{ asset('js/app.js') }}"></script>
    <script src="{{ asset('vendor/datatables/buttons.server-side.js') }}"></script>

And it's work fine

3s777 avatar Feb 15 '20 18:02 3s777

And I also noticed, when I use

it's default laravel setup, I get errors in console that jQuery and DataTables not defined

if I use or errors in console empty, but data don't showing, it's don't work

and if I delete defer, delete @push and delete @scripts it's begin work

3s777 avatar Feb 15 '20 18:02 3s777

@3s777 Thanks for the tip! The workaround really helped:

@section('content')
{{ $dataTable->table() }}
{{ $dataTable->scripts() }}
@endsection

ZAZmaster avatar Feb 18 '20 04:02 ZAZmaster

Hi, i'm using adminlte and my workaround is

instead of @Push('scripts') {{ $dataTable->scripts() }} @endpush

use @Push('js') {{ $dataTable->scripts() }} @endpush

BRobertORT avatar May 07 '20 21:05 BRobertORT

I use https://getstisla.com/getting-started and i have same problem. I think this is a problem with templating not on yajra packages or datatable because the console isn't displaying errors.

rizkhal avatar Jul 30 '20 15:07 rizkhal

I also had the same issue. i resolved it by adding @Stack('scripts') to my layout (app.blade). Like so

<script src="{{ asset('js/app.js') }}"></script>
@stack('scripts')

EvansPeazy avatar Aug 01 '20 19:08 EvansPeazy

it's still not working with me , i did every thing above and still no data showing, there are any one help me

EslamShaban avatar Aug 28 '20 07:08 EslamShaban

What I did to make it work (Laravel 7):

Edit resources/js/bootstrap.js and add the following:

require('bootstrap');
require('datatables.net-bs4');
require('datatables.net-buttons-bs4');

Edit resources/scss/app.scss and add the following:

// DataTables
@import "~datatables.net-bs4/css/dataTables.bootstrap4.css";
@import "~datatables.net-buttons-bs4/css/buttons.bootstrap4.css";

Then use

<script src="{{ mix('js/app.js') }}"></script>
// instead of 
<script src="{{ asset('js/app.js') }}"></script>
<script src="{{ asset('vendor/datatables/buttons.server-side.js') }}"></script>

Move script to the bottom

@stack('scripts')
</body>
</html>

zijld avatar Sep 15 '20 08:09 zijld

Still not working on me

wilsilscar avatar Sep 17 '20 04:09 wilsilscar

I FIXED scripts is not loading because of a typo the issue is at the bottom of default layout file has @yield('footer_scripts') but the table.blade file has @section('footerscripts') hope some else would better explain in details.

afsal9 avatar Dec 06 '20 09:12 afsal9

public function list() {
        $dataTable = new ApartmentDataTable();

        $vars['apartmentTable'] = $dataTable->html();

        return view('apartment.index', $vars);
}

parsasamandi avatar Feb 26 '21 06:02 parsasamandi

SOLUTION 1 Look for this file in your project

vendor/datatables/buttons.server-side.js

The copy it and put it in your assets public folder and then make sure you include it as a scribe before

{{ $dataTable->scripts() }}

so, it should be like this

<script src="{{ url('/') }}/assets/js/buttons.server-side.js"></script>
{{ $dataTable->scripts() }}

and hopefully it will be fixed.

SOLUTION 2 Remove buttons. On your build method in the datatable class, remove buttons by adding something like this

 ->parameters([
        'dom' => 'Bfrtip',
        'buttons' => [],
    ]);

So, the final thing should look like this

public function html()
{
    return $this->builder()
                ->setTableId('users-table')
                ->columns($this->getColumns())
                ->minifiedAjax()
                ->dom('Bfrtip')
                ->orderBy(1)
                -->parameters([
                    'dom' => 'Bfrtip',
                    'buttons' => [],
                ]);
}

CONCLUSION If you still get an error, go to inspect and see if there is any warning. All the best!

mubahood avatar Apr 11 '22 00:04 mubahood

This issue is stale because it has been open for 30 days with no activity. Remove stale label or comment or this will be closed in 7 days.

github-actions[bot] avatar Feb 20 '23 00:02 github-actions[bot]

This issue was closed because it has been inactive for 7 days since being marked as stale.

github-actions[bot] avatar Feb 28 '23 00:02 github-actions[bot]