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 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.

View on GitHub
Deep Wiki
Context7
## 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,
]
  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;
    
    public function anyDataTable(Request $request)
    {
        return DataTables::eloquent(User::query())
            ->addColumn('action', function($row) {
                return '<button>Edit</button>';
            })
            ->make(true);
    }
    
  3. 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'
        });
    });
    

Implementation Patterns

Core Workflows

  1. 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);
    
  2. Query Builder:

    return DataTables::query(DB::table('users'))
        ->editColumn('created_at', function($date) {
            return Carbon::parse($date)->format('M d, Y');
        })
        ->make(true);
    
  3. Collections:

    return DataTables::collection(User::all())
        ->addIndexColumn()
        ->make(true);
    
  4. 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);
    

Advanced Patterns

  1. Dynamic Columns:

    $columns = [
        ['data' => 'id', 'name' => 'id'],
        ['data' => 'name', 'name' => 'name'],
        ['data' => 'email', 'name' => 'email'],
    ];
    
    return DataTables::eloquent(User::query())
        ->setColumnFormat($columns)
        ->make(true);
    
  2. Oracle-Specific Optimizations:

    // Use Oracle's ROWNUM for pagination (if needed)
    return DataTables::eloquent(User::query())
        ->setPaginate(50)
        ->make(true);
    
  3. Relation Handling:

    return DataTables::eloquent(User::query())
        ->addColumn('posts_count', function($user) {
            return $user->posts()->count();
        })
        ->make(true);
    
  4. Custom Ordering:

    return DataTables::eloquent(User::query())
        ->orderColumn('name', function($query) {
            $query->orderBy('last_name')
                  ->orderBy('first_name');
        })
        ->make(true);
    
  5. Export Integration:

    return DataTables::eloquent(User::query())
        ->exportColumns(['id', 'name', 'email'])
        ->make(true);
    

Gotchas and Tips

Common Pitfalls

  1. Oracle-Specific Issues:

    • Pagination: Oracle's 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);
      
    • Reserved Keywords: Oracle reserves words like order, group, etc. Use backticks or aliases:
      return DataTables::query(DB::table('`order` as orders'))
          ->make(true);
      
  2. Debugging:

    • Enable APP_DEBUG=true to log queries and inputs. Never use in production.
    • Check for ambiguous column names (common in joins):
      // 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);
      
  3. Performance:

    • N+1 Queries: Eager load relations explicitly:
      return DataTables::eloquent(User::with('posts')->query())
          ->make(true);
      
    • Select Clause: Limit columns to avoid over-fetching:
      return DataTables::eloquent(User::query()
          ->select(['id', 'name', 'email']))
          ->make(true);
      
  4. Configuration Quirks:

    • Column Aliases: Ensure aliases are unique, especially in joins:
      // 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']));
      
    • Case Sensitivity: Oracle is case-sensitive for unquoted identifiers. Use quotes or lowercase consistently.

Pro Tips

  1. Reusable DataTables: Create a base controller or trait:

    trait HandlesDataTables
    {
        protected function respondWithDataTable($query, $columns = [])
        {
            return DataTables::eloquent($query)
                ->addColumns($columns)
                ->make(true);
        }
    }
    
  2. 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);
    
  3. Column Control: Leverage server-side column control (v12.5.0+):

    return DataTables::eloquent(User::query())
        ->columnControlSearch([
            'name' => 'Name',
            'email' => 'Email',
        ])
        ->make(true);
    
  4. Testing: Mock DataTables responses in tests:

    $response = $this->get('/users/datatable')
        ->assertJsonStructure([
            'draw', 'recordsTotal', 'recordsFiltered', 'data'
        ]);
    
  5. Extension Points:

    • Custom Engines: Extend Yajra\DataTables\Engines\Engine for custom logic.
    • Request Handling: Override Yajra\DataTables\Request for custom input parsing.
    • Response Formatting: Extend Yajra\DataTables\DataTables to modify JSON output.
  6. Oracle-Specific Extensions:

    • Use DB::connection('oracle')->getPdo() for raw PDO queries if needed.
    • Customize the Oracle query builder for complex scenarios:
      DataTables::query(DB::connection('oracle')->table('users'))
          ->make(true);
      
  7. Caching: Cache frequent DataTable responses:

    return Cache::remember('users_datatable', 60, function() {
        return DataTables::eloquent(User::query())->make(true);
    });
    
  8. Security:

    • Sanitize inputs in custom filters:
      $keyword = $request->input('search.value');
      $query->where('name', 'like', "%{$keyword}%");
      
    • Use ->whereRaw() carefully to avoid SQL injection.
  9. **Legacy

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.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport