4

I'm getting an error when trying to setup a datatables with my laravel project.

DataTables warning: table id=DataTables_Table_0 - Ajax error. For more information about this error, please see http://datatables.net/tn/7

This is my controller.

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Transaction;
use DataTables;
use Illuminate\Support\Facades\DB;

class TestTableController extends Controller
{
public function index()
{
    return view('testtable');
}


public function getTestTable(Request $request)
{
    if ($request->ajax()) {
        $data = DB::table('transactions')->get();
        return Datatables::of($data)
            ->addIndexColumn()
            ->addColumn('action', function($row){
                $actionBtn = '<a href="javascript:void(0)" class="edit btn btn-success btn-sm">Edit</a> <a href="javascript:void(0)" class="delete btn btn-danger btn-sm">Delete</a>';
                return $actionBtn;
            })
            ->rawColumns(['action'])
            ->make(true);
    }
}
}

This my route.

Route::get('testtable', [TestTableController::class, 'index']);
Route::get('testtable/list', [TestTableController::class, 'getTestTable'])->name('testtable.list');

View/blade.

<body>
<div class="container mt-5">
    <h2 class="mb-4">Laravel 7|8 Yajra Datatables Example</h2>
    <table class="table table-bordered yajra-datatable">
        <thead>
            <tr>
                <th>ID</th>
                <th>Amount</th>
                <th>Charge</th>
                <th>Action</th>
            </tr>
        </thead>
        <tbody>
        </tbody>
    </table>
</div>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.0/jquery.validate.js"></script>
<script src="https://cdn.datatables.net/1.10.21/js/jquery.dataTables.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js">
</script>
<script src="https://cdn.datatables.net/1.10.21/js/dataTables.bootstrap4.min.js"> 
</script>

<script type="text/javascript">
$(function () {

var table = $('.yajra-datatable').DataTable({
    processing: true,
    serverSide: true,
    ajax: "{{ route('testtable.list') }}",
    columns: [
        {data: 'id', name: 'id'},
        {data: 'amount', name: 'amount'},
        {data: 'charge', name: 'charge'},
        {
            data: 'action',
            name: 'action',
            orderable: true,
            searchable: true
        },
    ]
});

});
</script>

This is the error from laravel debugbar.

Text

But the query did have results.

This is the output if I echo the query.

$data = DB::table('transactions')->get();
echo $data;

Text

Anything else I'm missing? The exact same code is working if I tested in a new fresh laravel installation. This is an existing project that I try to implement datatables. I guess there must be something from current project configuration that causing the issue.

4 Answers 4

2
+50

Your code in getTestTable function look fine. You got in the debugbar:

No query results for model [App\Frontend] testtable

But the code in getTestTable has nothing related to testtable so I guess route('testtable.list') doesn't get to that function. And the reason may be because you put a route like Route::get('testtable/{id}',... before Route::get('testtable/list', so when you call testtable/list, it will take list as id and go to other function.

If my guess is true, you can fix it by putting testtable/list before testtable/{id} route.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks @Cuong Le Ngoc. This answer solved my issue.
2

I share full details with Sample Code from my Project, this below Example code is a Manage Role DataTable from my project. please refer step by step & try to understand it.

first of all you need to install Laravel Yajra DataTable using below Composer command

composer require yajra/laravel-datatables-oracle

then after Define Routes in web.php as like my sample code

Route::get('/', [\App\Http\Controllers\Admin\RoleController::class, 'index'])->name('admin.roles.index');  //index all the data view...

Route::post('/', [\App\Http\Controllers\Admin\RoleController::class, 'getIndexUsers'])->name('admin.roles.getIndexRoles');  //Get Users for Laravel Yajra Datatable Index Page record...

then after create view file for it, I share sample from my project

<div class="card-body">
   <table id="role_table" class="table table-bordered table-striped w-100">
       <thead>
          <tr>
             <th>No.</th>
             <th>Role Name</th>
             <th>Role Slug</th>
             <th>Action</th>
          </tr>
       </thead>
                  
       <tfoot>
            <tr>
               <th>No.</th>
               <th>Role Name</th>
               <th>Role Slug</th>
               <th>Action</th>
            </tr>
       </tfoot>
   </table>
</div>
<!-- /.card-body -->

& in Footer Script define Function for Initialize the DataTable like below,

<script type="text/javascript">
    var dataTable = $('#role_table').DataTable({
        lengthMenu: [[10, 25, 50, -1], [10, 25, 50, "All"]],
        processing: true,
        serverSide: true,
        order: [],
        searchDelay: 500,
        "scrollX": "auto",
        "responsive": true,
        // "lengthChange": false,
        "autoWidth": true,
        ajax: {
            url: '{{ route("admin.roles.getIndexRoles")}}',
            type: 'post',
            headers: {
              'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          },
          data: function (data) {
                // data.fromValues = $("#filterUserType").serialize();
            },
        },
        columns: [
            {data: 'SrNo', //try with data: 'SrNo' OR data: 'id',
                render: function (data, type, row, meta) {
                    // return meta.row + meta.settings._iDisplayStart + 1;
                    return meta.row + 1;
                }, searchable: false, sortable: false
            },
            {data: 'role_name', name: 'role_name'},
            {data: 'role_slug', name: 'role_slug'},
            {data: 'action', name: 'action', searchable: false, sortable: false},
        ],
    });
  </script>

then after In your Controller load Yajra DataTable Class for use it

use Yajra\DataTables\DataTables; //for Laravel DataTable JS...

Now, create Function for Display View File like this,

public function index()
{
    return view('admin.roles.index');
}

Now I crated Function method for Ajax Request for DataTable Initialize

public function getIndexUsers(Request $request)
{
    $roles = Role::select('roles.*');
    if($request->order ==null){
        $roles->orderBy('id', 'desc');
    }
    $detail_data = $roles;
    return Datatables::of($detail_data)
        ->addColumn('action', function ($data) {
            return $this->DataTableAction($data);
        })
    ->rawColumns(['action'])
    ->make(true);
}

public function DataTableAction($data){
    $btn = '<div class="btn-group">';
        if($data->id == "1" || $data->id == "2"){
            $btn .= '<button type="button" class="btn btn-danger dropdown-toggle ml-2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" disabled>Action
                </button>';
        }else{
            $btn .= '<button type="button" class="btn btn-danger dropdown-toggle ml-2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Action
                    </button>';
        }
            $btn .= '<div class="dropdown-menu">';
            $btn .= '<a class="dropdown-item" href="'.route('admin.roles.edit',$data->id).'" style="color: black;" onmouseover=\'this.style.background="#dee2e6"\' onmouseout=\'this.style.background="none"\'><i class="far fa-edit text-primary"></i> Edit</a>';
            $btn .= '<div class="dropdown-divider"></div>';
            $btn .= '<a role_id="'.$data->id.'" class="dropdown-item deleteRole" href="#" style="color: black;" onmouseover=\'this.style.background="#dee2e6"\' onmouseout=\'this.style.background="none"\'><i class="far fa-trash-alt text-danger"></i> Delete</a>';
    $btn .= '</div>
        </div>';
    return $btn;
}

Important Note:- Currently I use Laravel 8 So, It's not necessary to needs to define Yajra Service Provider Class in config/app.php . But if you are getting any error in your different Laravel version then you wil needs to define Yajra Service Provider Class in config/app.php... for define it follow below steps

**

Note that, below step not compulsory, its depends on your Laravel version

**

config/app.php

.....
'providers' => [
    ....
    Yajra\DataTables\DataTablesServiceProvider::class,
]
'aliases' => [
    ....
    'DataTables' => Yajra\DataTables\Facades\DataTables::class,
]
.....

then Run below Command

php artisan optimize

then if you get any problem, try to Clear Cache using

php artisan cache:clear

Important Note:- If you define Service Provider Class in config/app.php & run optimize command, then May be Laravel will load it in autoload which is automatically called when your code references a class or interface that hasn't been loaded yet, I'm not sure

3 Comments

Hi @Harsh Patel,
@IzzatZ. Say what you find problem or error?
Thanks Patel. Yes my problem has been solved. Thanks to @Cuong Le Ngoc
0

if everything is ok in the app codes, you may loosed config for yajra.. so to configure it, you can go to the config folder in the app root directory and then open app.php file from there and add this line to the provider..

Yajra\DataTables\DataTablesServiceProvider::class

the result will be something like this:

    'providers' => [
     ..
     .. 
     ..
Yajra\DataTables\DataTablesServiceProvider::class,
    ]

and also add this line to the aliases:

Yajra\DataTables\Facades\DataTables::class

try like this:

'aliases' => [
 ..
 ..
 ..
 ..
 'DataTables' => Yajra\DataTables\Facades\DataTables::class,
]

finally, save the file(config\app.php) like above and then open up cmd or terminal and try to clear the app cached file(that includes the config cache) using the fallowing command:

php artisan optimize

Comments

-1

add this code in html file

<script>
    $.fn.dataTable.ext.errMode = 'throw';
</script>

1 Comment

Although this code might answer the question, I recommend that you also provide an explanation what your code does and how it solves the problem of the question. Answers with an explanation are usually more helpful and of better quality, and are more likely to attract upvotes.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.