Laravel Scout's built-in commands work on one model at a time. If your project has ten searchable models, that's ten separate scout:import calls every time you need to rebuild your indexes. This package fixes that.
Scout Bulk Actions auto-discovers every model that uses the Searchable trait and lets you import, flush, or refresh all of them with a single command. It also supports queued bulk imports for projects where synchronous indexing is too slow.
Read the full documentation at mozex.dev: searchable docs, version requirements, detailed changelog, and more.
I maintain this package along with several other open-source PHP packages used by thousands of developers every day.
If my packages save you time or help your business, consider sponsoring my work on GitHub Sponsors. Your support lets me keep these packages updated, respond to issues quickly, and ship new features.
Business sponsors get logo placement in package READMEs. See sponsorship tiers →
Requires PHP 8.2+ - see all version requirements
Install the package via Composer:
composer require mozex/laravel-scout-bulk-actionsThat's it. The package auto-registers its service provider via Laravel's package discovery.
Publish the config file:
php artisan vendor:publish --tag="scout-bulk-actions-config"This creates config/scout-bulk-actions.php:
return [
'model_directories' => [
app_path('Models'),
// base_path('Modules/*/Models'),
],
];The model_directories array tells the package where to look for your searchable models. By default it scans app/Models, which covers most Laravel projects.
Glob patterns work here too. If you're using a modular architecture, something like base_path('Modules/*/Models') will scan the Models directory inside every module at once.
After changing the config in production, run php artisan config:clear to pick up the new values.
Imports all discovered searchable models into the search index:
php artisan scout:import-allYou can control the chunk size (how many records are sent per batch) with the --chunk option:
php artisan scout:import-all --chunk=200If omitted, it falls back to the scout.chunk.searchable config value.
Removes all records from the search index for every discovered model:
php artisan scout:flush-allFor large datasets, synchronous imports can be slow. This command dispatches queued jobs that split each model's records into chunks by ID range, the same approach Scout's native scout:queue-import uses, but applied across all your models at once:
php artisan scout:queue-import-allOptions:
# Set the chunk size per job
php artisan scout:queue-import-all --chunk=500
# Specify which queue to dispatch jobs to
php artisan scout:queue-import-all --queue=indexingThis is the fastest way to rebuild indexes for projects with many models and millions of rows.
Flushes then imports, in one step. Useful when you need a clean re-index:
php artisan scout:refreshYou can also target a single model:
php artisan scout:refresh "App\Models\Post"When no model is specified, it runs scout:flush-all followed by scout:import-all under the hood. The --chunk option works here too.
All commands ask for confirmation when APP_ENV is production. To skip the prompt (for CI pipelines or automated scripts), pass --force:
php artisan scout:import-all --force
php artisan scout:flush-all --force
php artisan scout:queue-import-all --force
php artisan scout:refresh --forceThe package scans the directories you've configured using Symfony's Finder component. For each PHP file it finds, it:
- Converts the file path to a fully qualified class name.
- Checks via Reflection that the class is a concrete (non-abstract) Eloquent model.
- Verifies the class uses Laravel Scout's
Searchabletrait.
Models that pass all three checks are collected, and the chosen Scout command (scout:import, scout:flush, or scout:queue-import) runs against each one. A progress bar tracks the operation so you can see where things stand.
If any single model fails during the operation, the command stops immediately and returns a failure exit code.
Visit the documentation site for searchable docs auto-updated from this repository.
- AI Integration: Use this package with AI coding assistants via Context7 and Laravel Boost
- Requirements: PHP, Laravel, and dependency versions
- Changelog: Release history with linked pull requests and diffs
- Contributing: Development setup, code quality, and PR guidelines
- Questions & Issues: Bug reports, feature requests, and help
- Security: Report vulnerabilities directly via email
The MIT License (MIT). Please see License File for more information.