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

Livewire Csv Laravel Package

askdkc/livewire-csv

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Install the package:
    composer require askdkc/livewire-csv
    
  2. Run the setup command (publishes migrations, config, and prompts for migration execution):
    php artisan livecsv-setup
    
  3. Add HasCsvImports trait to your target model (e.g., User.php):
    use Askdkc\LivewireCsv\Concerns\HasCsvImports;
    
    class User extends Authenticatable {
        use HasCsvImports;
    }
    

First Use Case: Basic CSV Import

Embed the csv-importer component in a Blade view with minimal props:

<livewire:csv-importer
    :model="App\Models\User::class"
    :columns-to-map="['id', 'name', 'email']"
    :required-columns="['name', 'email']"
    :column-labels="['name' => 'Full Name', 'email' => 'Email']"
/>

Implementation Patterns

Core Workflow

  1. Define Model Requirements:

    • Map CSV columns to model fields via :columns-to-map.
    • Specify required columns for validation (:required-columns).
    • Use :column-labels for user-friendly field names.
  2. Upsert Logic:

    • Defaults to id for upserting. Override with :upsert-columns (requires a unique/index constraint on those columns).
    • Example migration for custom upsert:
      $table->unique(['email', 'name']); // For :upsert-columns="['email', 'name']"
      
  3. Queue-Based Processing:

    • Large files (>100MB default) are processed asynchronously via queues.
    • Ensure queue workers are running:
      php artisan queue:work
      

Integration Tips

  • TALL Stack Projects: Publish views and compile assets:
    php artisan vendor:publish --tag="csv-views"
    npm run dev
    
  • Non-TALL Projects: Include directives in <head> and <footer>:
    @csvStyles
    @csvScripts
    
  • Custom Delimiters: Configure in config/livewire-csv.php:
    'set_delimiter' => ';', // For TSV files
    

Button Component

Use Alpine.js-powered buttons for imports:

<x-csv-button class="bg-blue-500 text-white px-4 py-2 rounded">
    Import CSV
</x-csv-button>

Gotchas and Tips

Pitfalls

  1. Queue Dependencies:

    • Forgetting to run php artisan queue:batches-table and php artisan migrate will break async imports.
    • Fix: Run the setup command (livecsv-setup) or manually execute:
      php artisan queue:table
      php artisan queue:batches-table
      php artisan migrate
      
  2. Upsert Constraints:

    • :upsert-columns requires a unique/index constraint. Missing this causes silent failures.
    • Debug: Check Laravel logs for SQLSTATE[23000] errors (duplicate key violations).
  3. File Size Limits:

    • Default max upload size is 100MB (configurable in file_upload_size).
    • Workaround: For larger files, use chunked processing or external storage (e.g., S3).
  4. Delimiter Mismatches:

    • Hardcoded delimiters (e.g., ,) may fail for TSV files (;).
    • Solution: Set 'set_delimiter' => ';' in config and ensure files match.

Debugging

  • Queue Failures: Check failed_jobs table or logs for exceptions. Retry with:
    php artisan queue:retry all
    
  • Validation Errors: Livewire logs validation messages to the browser console. Use :validation-errors prop to display them:
    <livewire:csv-importer ... :validation-errors="$errors" />
    

Extension Points

  1. Custom Validation: Override validateRow() in your model’s HasCsvImports trait:

    public function validateRow(array $row): void {
        $this->validate($row, [
            'email' => 'required|email|unique:users,email,'.$this->id,
        ]);
    }
    
  2. Pre/Post-Import Hooks: Use model events (creating, updating) or queue listeners to extend logic.

  3. Custom Views: Publish and override default views:

    php artisan vendor:publish --tag="livewire-csv-views" --force
    

Performance Tips

  • Batch Processing: For very large datasets, implement chunked imports via chunk() in your model’s import() method.
  • Index Optimization: Ensure :upsert-columns are indexed to speed up lookups:
    $table->index(['email', 'name']);
    
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.
calmfox/watch-sylius
damienfern/grpc-symfony-bundle
atoolo/index-bundle
atoolo/genai-bundle
coprotoai/laravel-ticket
davidjln/llm-carbon-bundle
cryonighter/valid-request-bundle
coolms/taxonomy-bundle
coolms/field-bundle
articulate-orm/symfony
aaix/laravel-tall-architect
ephoto/akeneo-connector
emmanuelballery/eb-plantumlbundle
emielburgman/symfony-visitor-beacon
emielburgman/symfony-visit-storage
emielburgman/symfony-security-headers
emielburgman/symfony-log-viewer
emarref/xdebug-bundle
emarref/pubnub-bundle
elriseio/finance-money-bundle