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 Duplicate Laravel Package

coliving/laravel-duplicate

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Installation:

    composer require coliving/laravel-duplicate
    

    Publish the config (if needed) with:

    php artisan vendor:publish --provider="Neurony\Duplicate\DuplicateServiceProvider"
    
  2. Basic Setup: Add the HasDuplicates trait and implement getDuplicateOptions() in your Eloquent model:

    use Neurony\Duplicate\Traits\HasDuplicates;
    use Neurony\Duplicate\Options\DuplicateOptions;
    
    class Post extends Model
    {
        use HasDuplicates;
    
        public function getDuplicateOptions(): DuplicateOptions
        {
            return DuplicateOptions::instance();
        }
    }
    
  3. First Use Case: Duplicate a model instance with relationships:

    $originalPost = Post::find(1);
    $duplicatedPost = $originalPost->duplicate();
    

Implementation Patterns

Core Workflows

  1. Basic Duplication:

    $original = Post::with('author', 'comments')->find(1);
    $duplicate = $original->duplicate(); // Recursively duplicates all supported relationships
    
  2. Excluding Relationships:

    public function getDuplicateOptions(): DuplicateOptions
    {
        return DuplicateOptions::instance()
            ->exclude('comments'); // Skip duplicating comments
    }
    
  3. Customizing Duplication Logic:

    public function getDuplicateOptions(): DuplicateOptions
    {
        return DuplicateOptions::instance()
            ->customize('author', function ($original, $duplicate) {
                $duplicate->name = 'Copied ' . $original->name;
            });
    }
    
  4. Bulk Duplication:

    $posts = Post::where('published', false)->get();
    $duplicates = $posts->map->duplicate();
    

Integration Tips

  • Service Layer: Encapsulate duplication logic in a service to handle business rules:

    class PostService {
        public function duplicateDraft(int $postId): Post {
            $post = Post::findOrFail($postId);
            $duplicate = $post->duplicate();
            $duplicate->status = 'draft';
            $duplicate->save();
            return $duplicate;
        }
    }
    
  • API Endpoints:

    Route::post('/posts/{post}/duplicate', function (Post $post) {
        return response()->json($post->duplicate());
    });
    
  • Admin Panels: Use with Laravel Nova or Filament for UI duplication buttons:

    // Filament example
    public static function getDuplicateOptions(): DuplicateOptions
    {
        return DuplicateOptions::instance()
            ->exclude('deleted_at'); // Skip soft deletes
    }
    

Gotchas and Tips

Common Pitfalls

  1. Circular Relationships:

    • Issue: Infinite recursion with belongsToMany or self-referential relationships.
    • Fix: Explicitly exclude problematic relationships in getDuplicateOptions().
  2. Primary Key Conflicts:

    • Issue: Duplicate IDs may conflict if not handled.
    • Fix: The package auto-increments IDs by default, but verify with:
      DuplicateOptions::instance()->incrementPrimaryKey();
      
  3. Event Side Effects:

    • Issue: Observers/Events may trigger unintended behavior (e.g., sending emails).
    • Fix: Temporarily disable observers or use withoutEvents():
      $duplicate = $original->duplicate()->withoutEvents();
      
  4. Polymorphic Relationships:

    • Issue: morphTo/morphMany may not duplicate correctly if not configured.
    • Fix: Ensure polymorphic models also use HasDuplicates.

Debugging Tips

  • Log Duplication: Enable debug mode in config:

    'debug' => env('DUPLICATE_DEBUG', false),
    

    Then check Laravel logs for duplication steps.

  • Verify Relationships: Use dd($original->getRelations()) to inspect relationships before duplication.

  • Test Edge Cases:

    // Test with empty relationships
    $emptyPost = Post::find(1)->withoutRelations()->duplicate();
    

Extension Points

  1. Custom Duplicate Logic: Override the duplicate() method in your model:

    public function duplicate(array $attributes = [], array $relations = [])
    {
        $duplicate = parent::duplicate($attributes, $relations);
        $duplicate->slug = Str::slug('Copy of ' . $this->title);
        return $duplicate;
    }
    
  2. Event Handling: Listen for duplication events:

    // In EventServiceProvider
    protected $listen = [
        'Neurony\Duplicate\Events\Duplicating' => [
            'App\Listeners\LogDuplication',
        ],
    ];
    
  3. Custom Storage: Duplicate to a different database/table:

    DuplicateOptions::instance()
        ->connection('secondary')
        ->table('posts_archive');
    
  4. Performance: For large datasets, use chunking:

    Post::chunk(100, function ($posts) {
        foreach ($posts as $post) {
            $post->duplicate();
        }
    });
    
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.
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui
babelqueue/php-sdk
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
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