yajra/laravel-datatables-oracle
Laravel server-side processing for jQuery DataTables. Quickly return JSON from Eloquent, Query Builder, or Collections for DataTables’ AJAX option, with helpers like DataTables::eloquent(), ::query(), ::collection(), or ::make() for fast filtering, sorting, paging.
## Getting Started
### Minimal Setup
1. **Installation**:
```bash
composer require yajra/laravel-datatables-oracle:"^12"
For Laravel 5.5+, auto-discovery handles the service provider/facade registration. Otherwise, manually add to config/app.php:
'providers' => [
Yajra\DataTables\DataTablesServiceProvider::class,
],
'aliases' => [
'DataTables' => Yajra\DataTables\Facades\DataTables::class,
]
Publish Config (Optional):
php artisan vendor:publish --provider="Yajra\DataTables\DataTablesServiceProvider"
First Use Case: Create a route and controller method to return a DataTable response:
use Yajra\DataTables\Facades\DataTables;
public function anyDataTable(Request $request)
{
return DataTables::eloquent(User::query())
->addColumn('action', function($row) {
return '<button>Edit</button>';
})
->make(true);
}
Frontend Integration: Include DataTables CSS/JS and initialize the table:
<table id="users-table" class="display">
<thead>
<tr><th>Name</th><th>Email</th><th>Action</th></tr>
</thead>
</table>
$(function() {
$('#users-table').DataTable({
processing: true,
serverSide: true,
ajax: '/users/datatable'
});
});
Eloquent Integration:
// Basic query
return DataTables::eloquent(User::query())->make(true);
// Custom columns
return DataTables::eloquent(User::query())
->addColumn('full_name', function($user) {
return $user->first_name . ' ' . $user->last_name;
})
->make(true);
// Filtering
return DataTables::eloquent(User::query())
->filterColumn('name', function($query, $keyword) {
$query->where('first_name', 'like', "%{$keyword}%")
->orWhere('last_name', 'like', "%{$keyword}%");
})
->make(true);
Query Builder:
return DataTables::query(DB::table('users'))
->editColumn('created_at', function($date) {
return Carbon::parse($date)->format('M d, Y');
})
->make(true);
Collections:
return DataTables::collection(User::all())
->addIndexColumn()
->make(true);
Server-Side Processing:
// Disable server-side processing (client-side only)
return DataTables::eloquent(User::query())
->make(false);
// Custom server-side logic
return DataTables::eloquent(User::query())
->serverSide(function ($request, $query) {
if ($request->has('custom_filter')) {
$query->where('active', $request->input('custom_filter'));
}
})
->make(true);
Dynamic Columns:
$columns = [
['data' => 'id', 'name' => 'id'],
['data' => 'name', 'name' => 'name'],
['data' => 'email', 'name' => 'email'],
];
return DataTables::eloquent(User::query())
->setColumnFormat($columns)
->make(true);
Oracle-Specific Optimizations:
// Use Oracle's ROWNUM for pagination (if needed)
return DataTables::eloquent(User::query())
->setPaginate(50)
->make(true);
Relation Handling:
return DataTables::eloquent(User::query())
->addColumn('posts_count', function($user) {
return $user->posts()->count();
})
->make(true);
Custom Ordering:
return DataTables::eloquent(User::query())
->orderColumn('name', function($query) {
$query->orderBy('last_name')
->orderBy('first_name');
})
->make(true);
Export Integration:
return DataTables::eloquent(User::query())
->exportColumns(['id', 'name', 'email'])
->make(true);
Oracle-Specific Issues:
ROWNUM may cause issues with complex queries. Use setPaginate() carefully.
// Avoid this for complex queries:
DataTables::eloquent(User::query()->with('posts'))
->setPaginate(50)
->make(true);
order, group, etc. Use backticks or aliases:
return DataTables::query(DB::table('`order` as orders'))
->make(true);
Debugging:
APP_DEBUG=true to log queries and inputs. Never use in production.// Fix: Use table aliases or explicit column names
return DataTables::query(DB::table('users as u')
->select('u.id', 'u.name', 'p.title as post_title'))
->make(true);
Performance:
return DataTables::eloquent(User::with('posts')->query())
->make(true);
return DataTables::eloquent(User::query()
->select(['id', 'name', 'email']))
->make(true);
Configuration Quirks:
// Bad: Duplicate alias
DataTables::query(DB::table('users')
->select(['name as name', 'email as name']));
// Good: Unique aliases
DataTables::query(DB::table('users')
->select(['name as user_name', 'email as user_email']));
Reusable DataTables: Create a base controller or trait:
trait HandlesDataTables
{
protected function respondWithDataTable($query, $columns = [])
{
return DataTables::eloquent($query)
->addColumns($columns)
->make(true);
}
}
Dynamic Filtering:
Use filter() for dynamic where clauses:
return DataTables::eloquent(User::query())
->filter(function($query) {
if ($request->has('active')) {
$query->where('active', $request->input('active'));
}
})
->make(true);
Column Control: Leverage server-side column control (v12.5.0+):
return DataTables::eloquent(User::query())
->columnControlSearch([
'name' => 'Name',
'email' => 'Email',
])
->make(true);
Testing: Mock DataTables responses in tests:
$response = $this->get('/users/datatable')
->assertJsonStructure([
'draw', 'recordsTotal', 'recordsFiltered', 'data'
]);
Extension Points:
Yajra\DataTables\Engines\Engine for custom logic.Yajra\DataTables\Request for custom input parsing.Yajra\DataTables\DataTables to modify JSON output.Oracle-Specific Extensions:
DB::connection('oracle')->getPdo() for raw PDO queries if needed.DataTables::query(DB::connection('oracle')->table('users'))
->make(true);
Caching: Cache frequent DataTable responses:
return Cache::remember('users_datatable', 60, function() {
return DataTables::eloquent(User::query())->make(true);
});
Security:
$keyword = $request->input('search.value');
$query->where('name', 'like', "%{$keyword}%");
->whereRaw() carefully to avoid SQL injection.**Legacy
How can I help you explore Laravel packages today?