Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Datatables Oracle Laravel Package

yajra/laravel-datatables-oracle

Laravel package for DataTables server-side processing via AJAX. Build JSON responses from Eloquent, Query Builder, or Collections using a fluent API (DataTables::eloquent/query/collection/make). Supports modern Laravel versions and common DataTables features.

View on GitHub
Deep Wiki
Context7
## Getting Started

### Minimal Setup
1. **Installation**:
   ```bash
   composer require yajra/laravel-datatables-oracle:"^12"

For Laravel 13, use yajra/laravel-datatables:"^13".

  1. Publish Config (Optional):

    php artisan vendor:publish --provider="Yajra\DataTables\DataTablesServiceProvider"
    
  2. First Use Case: Create a route and controller method to return a DataTable response:

    use Yajra\DataTables\Facades\DataTables;
    
    Route::get('/users', function () {
        return DataTables::eloquent(User::query())->toJson();
    });
    
  3. Frontend Integration: Include DataTables CSS/JS in your Blade view:

    <link rel="stylesheet" href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css">
    <script src="https://code.jquery.com/jquery-3.7.0.js"></script>
    <script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
    

    Initialize the table:

    $(document).ready(function() {
        $('#users-table').DataTable({
            processing: true,
            serverSide: true,
            ajax: '/users'
        });
    });
    

Implementation Patterns

Core Workflows

  1. Eloquent Integration:

    // Basic usage
    return DataTables::eloquent(User::query())
        ->addColumn('full_name', function($user) {
            return $user->first_name . ' ' . $user->last_name;
        })
        ->toJson();
    
    // With custom queries
    $query = User::where('active', 1);
    return DataTables::eloquent($query)
        ->editColumn('status', function($user) {
            return $user->active ? 'Active' : 'Inactive';
        })
        ->toJson();
    
  2. Query Builder Integration:

    return DataTables::query(DB::table('users'))
        ->addColumn('full_name', function($user) {
            return $user->first_name . ' ' . $user->last_name;
        })
        ->toJson();
    
  3. Collection Integration:

    return DataTables::collection(User::all())
        ->addColumn('full_name', function($user) {
            return $user->first_name . ' ' . $user->last_name;
        })
        ->toJson();
    

Advanced Patterns

  1. Server-Side Processing with Oracle:

    return DataTables::eloquent(User::query())
        ->setConnection('oracle') // Explicitly set Oracle connection
        ->addIndexColumn()
        ->addColumn('action', function($user) {
            return '<button class="edit-btn" data-id="' . $user->id . '">Edit</button>';
        })
        ->rawColumns(['action'])
        ->make(true);
    
  2. Custom Filtering:

    return DataTables::eloquent(User::query())
        ->filterColumn('status', function($query, $keyword) {
            $query->where('active', 'like', "%{$keyword}%");
        })
        ->toJson();
    
  3. Dynamic Columns:

    $columns = [
        ['data' => 'id', 'name' => 'id', 'title' => 'ID'],
        ['data' => 'name', 'name' => 'name', 'title' => 'Name'],
    ];
    
    return DataTables::eloquent(User::query())
        ->setColumns($columns)
        ->toJson();
    
  4. API Resource Integration:

    return DataTables::resource(UserResource::collection(User::all()))
        ->addColumn('custom_field', function($resource) {
            return $resource->custom_field;
        })
        ->toJson();
    

Integration Tips

  1. Blade Integration:

    <table id="users-table" class="display">
        <thead>
            <tr>
                <th>ID</th>
                <th>Name</th>
                <th>Actions</th>
            </tr>
        </thead>
    </table>
    
    @push('scripts')
        <script>
            $(function() {
                $('#users-table').DataTable({
                    processing: true,
                    serverSide: true,
                    ajax: '{!! route('users.datatable') !!}',
                    columns: [
                        { data: 'id', name: 'id' },
                        { data: 'name', name: 'name' },
                        { data: 'action', name: 'action', orderable: false, searchable: false }
                    ]
                });
            });
        </script>
    @endpush
    
  2. Laravel Mix/Webpack: Ensure DataTables JS/CSS are included in your resources/js/app.js or resources/css/app.css.

  3. API Routes:

    Route::apiResource('users', UserController::class)->only(['index']);
    Route::get('users/datatable', [UserController::class, 'datatable'])->name('users.datatable');
    

Gotchas and Tips

Common Pitfalls

  1. Oracle-Specific Issues:

    • Ambiguous Column Names: Oracle is strict about column aliases. Use explicit aliases:
      return DataTables::eloquent(User::query())
          ->selectRaw('id as user_id, name as user_name')
          ->toJson();
      
    • Case Sensitivity: Oracle treats unquoted identifiers as uppercase. Use quotes for case-sensitive columns:
      return DataTables::eloquent(User::query())
          ->selectRaw('"FirstName" as first_name')
          ->toJson();
      
  2. Debugging:

    • Enable APP_DEBUG=true to log queries and inputs.
    • Use ->toArray() to inspect the raw response before converting to JSON:
      return DataTables::eloquent(User::query())->toArray();
      
  3. Performance:

    • Avoid select('*'): Explicitly define columns to reduce query load.
    • Use ->make(true): For large datasets, enable server-side processing explicitly:
      return DataTables::eloquent(User::query())->make(true);
      
    • Indexing: Ensure your Oracle tables have proper indexes for columns used in orderBy and where clauses.
  4. Configuration Quirks:

    • Column Naming: Avoid reserved words (e.g., order, group) as column names.
    • Custom Config: Publish the config file and adjust settings like:
      'column_defs' => [
          'orderable' => false,
          'searchable' => false,
          'visible' => false,
      ],
      

Debugging Tips

  1. Log Queries:

    DB::enableQueryLog();
    $result = DataTables::eloquent(User::query())->toJson();
    \Log::info('Queries:', ['queries' => DB::getQueryLog()]);
    
  2. Inspect Request:

    \Log::info('DataTables Request:', request()->all());
    
  3. Test with Postman: Send a POST request to your DataTable endpoint with the following body:

    {
        "draw": 1,
        "columns": [
            { "data": "id", "name": "id", "searchable": true, "orderable": true, "search": { "value": "", "regex": false } },
            { "data": "name", "name": "name", "searchable": true, "orderable": true, "search": { "value": "", "regex": false } }
        ],
        "order": [
            { "column": 0, "dir": "asc" }
        ],
        "start": 0,
        "length": 10,
        "search": { "value": "", "regex": false }
    }
    

Extension Points

  1. Custom Request Handling: Override the request handling in your controller:

    public function datatable()
    {
        $request = DataTables::of(User::query())->getRequest();
        // Custom logic here
        return DataTables::of(User::query())->make(true);
    }
    
  2. Middleware for DataTables:

    Route::middleware(['datatables'])->group(function () {
        Route::get('/admin/users', [UserController::class, 'datatable']);
    });
    
  3. Event Listeners: Listen to DataTables events (e.g., datatables.pre-query):

    DataTables::preQuery(function ($query) {
        // Modify the query before execution
    });
    
  4. Service Provider Extensions: Bind custom DataTable classes in your service provider:

    $this->app->bind('datatables.custom', function () {
        return new CustomDataTable();
    });
    

Oracle-Specific Tips

  1. Date Handling: Oracle dates are stored as timestamps.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle
atriumphp/atrium
sandermuller/package-boost-laravel
sandermuller/boost-skills
redaxo/core
yusufgenc/filament-api-forge
l3aro/rating-star-for-filament
leek/filament-subtenant-scope
anil/file-picker
broqit/fields-ai