11# DataTables Quick Starter
22
3- ## Create new project
3+ ## Create a new Laravel project
44
55```
66laravel new datatables
77cd datatables
8- cp .env.example .env
9- php artisan key:generate
108```
119
12- ## Setup database and ENV configuration
10+ ## Setup Laravel UI
1311
14- Create a new database and update ` .env ` file and set the datbase credentials.
12+ ``` shell
13+ composer require laravel/ui --dev
14+ php artisan ui bootstrap --auth
15+ ```
1516
16- ## Install package and publish assets
17+ ## Install Laravel DataTables
1718
19+ ``` shell
20+ composer require yajra/laravel-datatables:^9.0
1821```
19- composer require yajra/laravel-datatables
20- php artisan vendor:publish --tag=datatables-buttons
2122
22- ```
23+ ## Setup database and ENV configuration
2324
24- ## Setup Laravel UI
25+ Create a new database and update ` .env ` file and set the database credentials.
2526
26- ```
27- composer require laravel/ui --dev
28- php artisan ui bootstrap --auth
27+ ``` shell
28+ touch database/database.sqlite
2929```
3030
31- ## Install Datatables.net assets
31+ ``` dotenv
32+ DB_CONNECTION=sqlite
33+ DB_DATABASE=/absolute/path/to/database/database.sqlite
34+ ```
3235
36+ ``` shell
37+ php artisan migrate
3338```
34- yarn add datatables.net-bs4 datatables.net-buttons-bs4 datatables.net-select-bs4 datatables.net-searchpanes-bs4
39+
40+ ## Install Laravel DataTables Vite Assets
41+
42+ ``` shell
43+ npm i laravel-datatables-vite --save-dev
3544```
3645
37- > {tip} ` datatables.net-select-bs4 ` and ` datatables.net-searchpanes-bs4 ` are only required if you want to use SearchPanes
46+ This will install the following packages:
47+
48+ 1 . Bootstrap Icons
49+ 2 . DataTables with Buttons and Select plugins for Bootstrap 5
50+ 3 . Laravel DataTables custom scripts
3851
39- ## Register datatables.net assets in bootstrap. js and app.scss
52+ ## Register the package js and css
4053
41- Edit ` resources/js/bootstrap .js ` and add the following:
54+ Edit ` resources/js/app .js ` and add the following:
4255
43- require('bootstrap');
44- require('datatables.net-bs4');
45- require('datatables.net-buttons-bs4');
46- require('datatables.net-select-bs4');
47- require('datatables.net-searchpanes-bs4');
56+ ``` js
57+ import ' ./bootstrap' ;
58+ import ' laravel-datatables-vite' ;
59+ ```
4860
49- Edit ` resources/scss /app.scss ` and add the following:
61+ Edit ` resources/sass /app.scss ` and add the following:
5062
51- // DataTables
52- @import "~datatables.net-bs4/css/dataTables.bootstrap4.css";
53- @import "~datatables.net-buttons-bs4/css/buttons.bootstrap4.css";
54- @import '~datatables.net-select-bs4/css/select.dataTables.css';
55- @import '~datatables.net-searchpanes-dt/css/searchPanes.dataTables.css';
63+ ``` postcss
64+ // Fonts
65+ @import url('https://fonts.bunny.net/css?family=Nunito');
5666
57- ## Compile assets
67+ // Variables
68+ @import 'variables';
5869
59- ```
60- yarn dev / watch / prod
70+ // Bootstrap
71+ @import 'bootstrap/scss/bootstrap';
72+
73+ // DataTables
74+ @import 'bootstrap-icons/font/bootstrap-icons.css';
75+ @import "datatables.net-bs5/css/dataTables.bootstrap5.min.css";
76+ @import "datatables.net-buttons-bs5/css/buttons.bootstrap5.min.css";
77+ @import 'datatables.net-select-bs5/css/select.bootstrap5.css';
6178```
6279
63- ## Create controller and DataTable class
80+ ## Compile the assets
6481
6582```
66- php artisan make:controller UsersController
67- php artisan datatables:make Users
83+ npm run dev
6884```
6985
70- ### UsersController
86+ ## Create and update UsersDataTable
7187
72- ``` php
73- namespace App\Http\Controllers;
74-
75- use App\DataTables\UsersDataTable;
88+ Create a new DataTable class:
7689
77- class UsersController extends Controller
78- {
79- public function index(UsersDataTable $dataTable)
80- {
81- return $dataTable->render('users.index');
82- }
83- }
90+ ``` shell
91+ php artisan datatables:make Users
8492```
8593
86- ### UsersDataTable
94+ Then, update the ` getColumns() ` with the users fields:
8795
8896``` php
8997namespace App\DataTables;
9098
91- use App\User;
99+ use App\Models\User;
100+ use Illuminate\Database\Eloquent\Builder as QueryBuilder;
101+ use Yajra\DataTables\EloquentDataTable;
102+ use Yajra\DataTables\Html\Builder as HtmlBuilder;
92103use Yajra\DataTables\Html\Button;
93104use Yajra\DataTables\Html\Column;
94- use Yajra\DataTables\Html\Editor\Editor;
95- use Yajra\DataTables\Html\Editor\Fields;
96105use Yajra\DataTables\Services\DataTable;
97106
98107class UsersDataTable extends DataTable
99108{
100- /**
101- * Build DataTable class.
102- *
103- * @param mixed $query Results from query() method.
104- * @return \Yajra\DataTables\DataTableAbstract
105- */
106- public function dataTable($query)
109+ public function dataTable(QueryBuilder $query): EloquentDataTable
107110 {
108- return datatables()
109- ->eloquent($query)
110- ->addColumn('action', 'users.action');
111+ return (new EloquentDataTable($query))->setRowId('id');
111112 }
112113
113- /**
114- * Get query source of dataTable.
115- *
116- * @param \App\User $model
117- * @return \Illuminate\Database\Eloquent\Builder
118- */
119- public function query(User $model)
114+ public function query(User $model): QueryBuilder
120115 {
121116 return $model->newQuery();
122117 }
123118
124- /**
125- * Optional method if you want to use html builder.
126- *
127- * @return \Yajra\DataTables\Html\Builder
128- */
129- public function html()
119+ public function html(): HtmlBuilder
130120 {
131121 return $this->builder()
132122 ->setTableId('users-table')
133123 ->columns($this->getColumns())
134124 ->minifiedAjax()
135- ->dom('Bfrtip')
136125 ->orderBy(1)
137- ->buttons(
138- Button::make('create'),
139- Button::make('export'),
126+ ->selectStyleSingle()
127+ ->buttons([
128+ Button::make('add'),
129+ Button::make('excel'),
130+ Button::make('csv'),
131+ Button::make('pdf'),
140132 Button::make('print'),
141133 Button::make('reset'),
142- Button::make('reload')
143- );
134+ Button::make('reload'),
135+ ] );
144136 }
145137
146- /**
147- * Get columns.
148- *
149- * @return array
150- */
151- protected function getColumns()
138+ protected function getColumns(): array
152139 {
153140 return [
154- Column::computed('action')
155- ->exportable(false)
156- ->printable(false)
157- ->width(60)
158- ->addClass('text-center'),
159141 Column::make('id'),
160142 Column::make('name'),
161143 Column::make('email'),
@@ -164,26 +146,48 @@ class UsersDataTable extends DataTable
164146 ];
165147 }
166148
167- /**
168- * Get filename for export.
169- *
170- * @return string
171- */
172- protected function filename()
149+ protected function filename(): string
150+ {
151+ return 'Users_'.date('YmdHis');
152+ }
153+ }
154+ ```
155+
156+ ## Create and update the users controller
157+
158+ Create a new controller and add the following:
159+
160+ ``` shell
161+ php artisan make:controller UsersController
162+ ```
163+
164+ ``` php
165+ namespace App\Http\Controllers;
166+
167+ use App\DataTables\UsersDataTable;
168+
169+ class UsersController extends Controller
170+ {
171+ public function index(UsersDataTable $dataTable)
173172 {
174- return 'Users_' . date('YmdHis ');
173+ return $dataTable->render('users.index ');
175174 }
176175}
177176```
178177
179- ## Update app layout
178+ ## Update the default app layout
180179
181- Add scripts before the body end tag of ` resources/views/layouts/app.blade.php `
180+ Add ` @stack(' scripts') ` before the body end tag of ` resources/views/layouts/app.blade.php `
182181
183182```
184- <script src="{{ mix('js/app.js') }}"></script>
185- <script src="{{ asset('vendor/datatables/buttons.server-side.js') }}"></script>
183+ ....
184+ <main class="py-4">
185+ @yield('content')
186+ </main>
187+ </div>
186188 @stack('scripts')
189+ </body>
190+ </html>
187191```
188192
189193## Create users index file
@@ -194,11 +198,18 @@ Create new file: `resources/views/users/index.blade.php`.
194198@extends('layouts.app')
195199
196200@section('content')
197- {{$dataTable->table()}}
201+ <div class =" container" >
202+ <div class =" card" >
203+ <div class =" card-header" >Manage Users</div >
204+ <div class =" card-body" >
205+ {{ $dataTable->table() }}
206+ </div >
207+ </div >
208+ </div >
198209@endsection
199210
200211@push('scripts')
201- {{$dataTable->scripts() }}
212+ {{ $dataTable->scripts(attributes: ['type' => 'module']) }}
202213@endpush
203214```
204215
@@ -207,7 +218,9 @@ Create new file: `resources/views/users/index.blade.php`.
207218Update ` routes/web.php ` .
208219
209220``` php
210- Route::get('/users', 'UsersController@index')->name('users.index');
221+ use App\Http\Controllers\UsersController;
222+
223+ Route::get('/users', [UsersController::class, 'index'])->name('users.index');
211224```
212225
213226## Create dummy data using tinker
@@ -216,7 +229,7 @@ Route::get('/users', 'UsersController@index')->name('users.index');
216229php artisan tinker
217230
218231Psy Shell v0.9.9 (PHP 7.2.22 — cli) by Justin Hileman
219- >>> factory('App\User', 100)->create()
232+ >>> User:: factory(100)->create()
220233```
221234
222235## Access Users DataTables
0 commit comments