A lightweight Laravel package to track changes in your models. Automatically logs all changes, including old values, new values, and the user responsible for the changes.
- Automatically tracks changes in any Eloquent model.
- Stores old and new values of updated fields.
- Logs the user who made the change (if authenticated).
- Provides easy integration with a simple trait.
- Configurable to exclude fields from tracking.
- Includes a migration to store logs in a
model_changes
table.
- Laravel 8.x or 9.x
- PHP 7.4 or higher
-
Install via Composer:
composer require temistocle1998/laravel-model-tracker
-
Publish configuration and migration files:
php artisan vendor:publish --tag=tracker-config php artisan migrate
-
Add the
TracksChanges
trait to your model:In any model where you want to track changes, simply include the
TracksChanges
trait:use Tracker\Traits\TracksChanges; class Product extends Model { use TracksChanges; }
The package comes with a config file that can be customized to suit your needs. The configuration file can be found at config/tracker.php
.
return [
'enabled' => true, // Enable or disable the tracking
'exclude_fields' => ['password', 'remember_token'], // Fields you don't want to track
];
Once the package is set up, any changes made to the models using the TracksChanges
trait will automatically be logged. The logs are stored in the model_changes
table.
When a model is updated, the following log is created in the model_changes
table:
model_type | model_id | user_id | changes | created_at |
---|---|---|---|---|
App\Models\Product | 1 | 2 | {"name": {"old_value": "Old Name", "new_value": "New Name"}} | 2023-01-01 12:00:00 |
You can fetch model changes using the ModelChange
model.
use Tracker\Models\ModelChange;
// Get all changes for a specific model
$changes = ModelChange::where('model_type', 'App\Models\Product')
->where('model_id', $productId)
->get();
// Display the changes
foreach ($changes as $change) {
echo $change->changes;
}
You can also display the changes in your views:
@foreach ($product->changes as $change)
<p>Field: {{ $change['field'] }} | Old Value: {{ $change['old_value'] }} | New Value: {{ $change['new_value'] }}</p>
@endforeach
Feel free to submit a pull request if you'd like to contribute to this package. All contributions are welcome!
This package is licensed under the MIT License. See the LICENSE file for details.