mozex/laravel-scout-bulk-actions
Installation:
composer require mozex/laravel-scout-bulk-actions
Publish the config (optional):
php artisan vendor:publish --provider="Mozex\ScoutBulkActions\ScoutBulkActionsServiceProvider" --tag="config"
First Use Case: Run a bulk import for all searchable models:
php artisan scout:bulk-import
For queued imports (recommended for large datasets):
php artisan scout:bulk-queue-import
Where to Look First:
config/scout-bulk-actions.php (customize batch size, queue connection, or excluded models).scout:bulk-import, scout:bulk-flush, scout:bulk-queue-import, scout:bulk-queue-flush.php artisan scout:bulk-import --help for options like --batch-size or --force.Synchronous Bulk Import: Use for small datasets or development:
php artisan scout:bulk-import --batch-size=100
Queued Bulk Import: For production or large datasets:
php artisan scout:bulk-queue-import --batch-size=500 --queue=scout
scout connection) for background processing.php artisan queue:work or a queue monitor (e.g., Laravel Horizon).Selective Model Handling: Exclude specific models via config:
// config/scout-bulk-actions.php
'exclude' => [
'App\Models\UnwantedModel',
],
toSearchableArray() logic that shouldn’t run in bulk.Progress Tracking: The package auto-generates a progress bar for synchronous imports. For queued jobs, log progress via job events:
// In your job class (extends Mozex\ScoutBulkActions\Jobs\BulkImportJob)
protected function handle(): void {
$this->dispatchBrowserEvent('progress', ['model' => $this->model, 'progress' => $this->progress]);
}
Integration with Scout Events: Listen to bulk actions via Scout’s events:
Scout::flushing($modelClass, function () {
// Pre-flush logic
});
Custom Job Classes: Extend the base job to add pre/post-processing:
namespace App\Jobs;
use Mozex\ScoutBulkActions\Jobs\BulkImportJob;
class CustomBulkImportJob extends BulkImportJob {
public function handle() {
// Custom logic before/after import
parent::handle();
}
}
'queue_job' => App\Jobs\CustomBulkImportJob::class,
Chunked Processing:
Override getBatchSize() in a custom job to dynamically adjust batch sizes:
public function getBatchSize(): int {
return $this->model::count() < 1000 ? 200 : 500;
}
Post-Import Actions: Chain commands or scripts after bulk imports:
php artisan scout:bulk-import && php artisan optimize:clear
Testing: Mock bulk actions in tests:
$this->artisan('scout:bulk-flush')
->expectsQuestion('Confirm flush', 'yes')
->assertExitCode(0);
Queue Stuck Jobs:
php artisan queue:failed-table and retry manually:
php artisan queue:retry all
Memory Limits:
--batch-size) can hit PHP memory limits.batch-size=100 and increase incrementally. Use scout:bulk-queue-import for large datasets.Model Auto-Discovery:
Searchable trait or have custom Scout configurations.'models' => [
App\Models\Product::class,
App\Models\Article::class,
],
Race Conditions:
--force sparingly and ensure only one process runs at a time:
php artisan scout:bulk-import --force
Scout Driver Compatibility:
Verbose Output: Enable debug mode for detailed logs:
php artisan scout:bulk-import --verbose
Job Logging:
Configure the queue driver to log job failures (e.g., Redis with failed_table or database logging).
Progress Bar Issues:
--no-progress:
php artisan scout:bulk-import --no-progress
Custom Scout Logic:
toSearchableArray() or shouldBeSearchable() may behave unexpectedly.Custom Commands: Extend the base command to add project-specific logic:
namespace App\Console\Commands;
use Mozex\ScoutBulkActions\Console\BulkImportCommand;
class CustomBulkImportCommand extends BulkImportCommand {
protected $signature = 'scout:custom-import {--batch-size=100}';
public function handle() {
// Custom logic
parent::handle();
}
}
Event Listeners: Listen to bulk action events for analytics or notifications:
ScoutBulkActions::bulkImportStarted(function () {
Log::info('Bulk import started');
});
Dynamic Model Filtering:
Override getModels() in a custom command to filter models dynamically:
protected function getModels(): array {
return Model::where('is_searchable', true)->get()->toArray();
}
Post-Import Webhooks: Trigger HTTP requests or notifications after bulk imports:
ScoutBulkActions::bulkImportCompleted(function () {
Http::post('https://analytics.example.com/import-complete');
});
Batch Size:
100. Adjust based on your server’s memory (e.g., 500 for high-memory servers).Queue Connection:
default. Specify a dedicated queue (e.g., scout) for bulk actions:
'queue_connection' => 'scout',
Excluded Models:
Force Flag:
--force bypasses confirmation prompts. Use cautiously in production.Index Optimization:
scout:bulk-flush before bulk imports to clear stale data:
php artisan scout:bulk-flush && php artisan scout:bulk-import
Database Indexes:
searchable column is indexed for faster bulk operations.Queue Workers:
queue:work) based on bulk import size. Example for 10 workers:
php artisan queue:work --queue=scout --daemon --tries=3 --sleep=3 --memory=512
Parallel Processing:
How can I help you explore Laravel packages today?