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

Eloquent Datatable Laravel Package

livecontrol/eloquent-datatable

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps to First Use

  1. Installation

    composer require livecontrol/eloquent-datatable
    

    Add the package to your composer.json and run composer update.

  2. Basic Setup

    • Include DataTables CSS/JS in your Blade view:
      <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.21/css/jquery.dataTables.css">
      <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
      <script src="https://cdn.datatables.net/1.10.21/js/jquery.dataTables.js"></script>
      
    • Initialize DataTables with server-side processing:
      $(document).ready(function() {
          $('#users-table').DataTable({
              processing: true,
              serverSide: true,
              ajax: {
                  url: '/users/datatable',
                  type: 'POST',
                  headers: {
                      'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                  }
              }
          });
      });
      
  3. First Controller Route Define a route and controller method:

    Route::post('/users/datatable', [UserController::class, 'datatable']);
    

    Implement the method:

    public function datatable()
    {
        $users = new \App\Models\User();
        $dataTable = new \LiveControl\EloquentDataTable\DataTable($users, ['id', 'name', 'email']);
        return $dataTable->make();
    }
    
    • Key: Replace ['id', 'name', 'email'] with the columns you want to display.

Implementation Patterns

Core Workflow

  1. Model Integration

    • Pass an Eloquent model instance to DataTable:
      $dataTable = new DataTable(new \App\Models\Post(), ['title', 'body', 'created_at']);
      
    • Use make() to generate the response:
      return $dataTable->make();
      
  2. Column Customization

    • Basic Columns: Define columns as an array of attribute names.
    • Custom Columns: Use closures for computed columns:
      $dataTable = new DataTable($users, [
          'id',
          'name',
          function($user) {
              return '<a href="/users/'.$user->id.'">View</a>';
          }
      ]);
      
    • Column Formatting: Use setColumnFormatters:
      $dataTable->setColumnFormatters([
          'created_at' => function($value) {
              return \Carbon\Carbon::parse($value)->format('M d, Y');
          }
      ]);
      
  3. Query Scoping

    • Global Scopes: Apply scopes to the underlying query:
      $dataTable = new DataTable($users->where('active', true), ['name', 'email']);
      
    • Dynamic Scoping: Use addQuery for runtime conditions:
      $dataTable->addQuery(function($query) {
          $query->where('status', 'published');
      });
      
  4. Pagination and Sorting

    • Handled automatically via DataTables server-side processing.
    • Customize with setDefaultSort:
      $dataTable->setDefaultSort([['column' => 2, 'dir' => 'desc']]);
      
  5. API Integration

    • Request Handling: Bind DataTables request data to a DTO or use $request->input():
      $draw = $request->input('draw', 1);
      $start = $request->input('start', 0);
      $length = $request->input('length', 10);
      
    • Response: Always return json_encode($dataTable->make()).

Advanced Patterns

  1. Relationships

    • Eager load relationships and access them in columns:
      $posts = new \App\Models\Post();
      $dataTable = new DataTable($posts, [
          'title',
          function($post) {
              return $post->author->name;
          }
      ]);
      
    • Ensure relationships are loaded in the query:
      $posts->with('author');
      
  2. Conditional Logic

    • Use addQuery for dynamic filtering:
      if ($request->has('search')) {
          $dataTable->addQuery(function($query) use ($request) {
              $query->where('name', 'like', '%'.$request->search.'%');
          });
      }
      
  3. Exporting Data

    • Combine with Laravel Excel or similar for CSV/Excel exports:
      $data = $dataTable->getQuery()->get();
      return Excel::download(new UsersExport($data), 'users.xlsx');
      
  4. Multi-Table Queries

    • Use joins and custom queries:
      $query = \App\Models\User::query()
          ->join('posts', 'users.id', '=', 'posts.user_id')
          ->select('users.*', 'posts.count as post_count');
      $dataTable = new DataTable($query, ['name', 'email', 'post_count']);
      

Gotchas and Tips

Pitfalls

  1. CSRF Protection

    • Issue: Forgetting CSRF token in AJAX requests causes 419 errors.
    • Fix: Include the token in headers or meta tags:
      <meta name="csrf-token" content="{{ csrf_token() }}">
      
      headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }
      
  2. Column Mismatch

    • Issue: Returning fewer columns than defined in the DataTable constructor causes misaligned data.
    • Fix: Ensure all columns in the array are either model attributes or valid closures.
  3. Deprecated DataTables Version

    • Issue: Using an unsupported DataTables version may break JSON response format.
    • Fix: Explicitly set the transformer:
      $dataTable->setVersionTransformer(new \LiveControl\EloquentDataTable\VersionTransformers\Version110Transformer());
      
  4. N+1 Queries

    • Issue: Accessing relationships in columns without eager loading triggers N+1 queries.
    • Fix: Always eager load relationships:
      $dataTable = new DataTable($users->with('author'), ['name', 'author.name']);
      
  5. Case Sensitivity

    • Issue: Column names in the constructor must match Eloquent attribute names exactly (case-sensitive).
    • Fix: Use snake_case consistently or access attributes via getAttribute():
      $dataTable->setColumnFormatters([
          'user_name' => function($user) {
              return $user->getAttribute('name');
          }
      ]);
      

Debugging Tips

  1. Inspect Raw Query

    • Log the query builder instance to debug:
      \Log::info($dataTable->getQuery()->toSql(), $dataTable->getQuery()->getBindings());
      
  2. Validate Request Data

    • Dump DataTables request payload:
      \Log::info($request->all());
      
    • Expected keys: draw, start, length, columns, order, search.
  3. Check JSON Response

    • Ensure the response matches DataTables expected format:
      {
          "draw": 1,
          "recordsTotal": 100,
          "recordsFiltered": 50,
          "data": [...]
      }
      

Extension Points

  1. Custom Transformers

    • Extend \LiveControl\EloquentDataTable\VersionTransformers\BaseTransformer to support new DataTables versions.
  2. Query Modifiers

    • Override applyQueryModifiers to add custom logic:
      $dataTable->setQueryModifier(function($query, $request) {
          // Custom logic here
      });
      
  3. Response Customization

    • Extend the make() method or use a decorator pattern to modify the response:
      $response = $dataTable->make();
      $response['custom_field'] = 'value';
      
  4. Integration with Laravel Policies

    • Apply authorization within the DataTable constructor or addQuery:
      $dataTable = new DataTable($this->authorize()->users(), ['name', 'email']);
      

Performance Tips

  1. Selective Column Loading

    • Explicitly select columns to reduce query size:
      $dataTable = new DataTable($users->select(['id', 'name', 'email']), ['name', 'email']);
      
  2. Indexing

    • Add indexes to frequently filtered columns:
      Schema::table('users', function (Blueprint $table) {
          $table->index('email');
      });
      
  3. Caching

    • Cache the
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.
craftcms/url-validator
directorytree/privacy-filter-classifier
directorytree/privacy-filter
datacore/hub-sdk
develia/commons
cuci/prototurk-sdk
cuci/prototurk-sdk-symfony
develia/geo-bundle
dreamzy/livewire-charts
touchestate-sdk/php-sdk
22h/doctrine-garbage-collection-bundle
agtp/agtp-php
agtp/mod-php
splash/sonata-admin
splash/metadata
splash/openapi
splash/scopes
splash/toolkit
testo/output-teamcity
testo/bridge-symfony