isaevdimka / laravel-model-changes-history
Model changes history for laravel
Requires
- php: >=7.4
- ext-json: *
- laravel/framework: >=5.8
- predis/predis: ^1.1
This package is auto-updated.
Last update: 2025-04-29 01:04:25 UTC
README
Records the changes history made to an eloquent model.
Quick start
Your model must have an id
field!
composer require isaevdimka/laravel-model-changes-history
php artisan vendor:publish --tag="model-changes-history"
php artisan migrate
Note: this library use database
storage as default.
Installation
composer require isaevdimka/laravel-model-changes-history
The package is auto discovered.
To change the config, publish it using the following command:
php artisan vendor:publish --provider="ModelChangesHistory\Providers\ModelChangesHistoryServiceProvider" --tag="config"
You can use three ways for record changes: 'storage' => 'database', 'file' or 'redis'
If you want to use database
storage, you must publish the migration file, run the following artisan commands:
php artisan vendor:publish --provider="ModelChangesHistory\Providers\ModelChangesHistoryServiceProvider" --tag="migrations"
php artisan migrate
Use this environment to manage library:
# Global recorgin model changes history RECORD_CHANGES_HISTORY=true # Default storage for recorgin model changes history MODEL_CHANGES_HISTORY_STORAGE=database
Usage
Add the trait to your model class you want to record changes history for:
use ModelChangesHistory\Traits\HasChangesHistory; use Illuminate\Database\Eloquent\Model; class TestModel extends Model { use HasChangesHistory; /** * The attributes that are mass assignable. * This will also be hidden for changes history. * * @var array */ protected $hidden = ['password', 'remember_token']; }
Your model now has a relation to all the changes made:
$testModel->latestChange(); ModelChangesHistory\Models\Change { ... #attributes: [ "model_id" => 1 "model_type" => "App\TestModel" "before_changes" => "{...}" "after_changes" => "{...}" "change_type" => "updated" "changes" => "{ "title": { "before": "Some old title", "after": "This is the new title" }, "body": { "before": "Some old body", "after": "This is the new body" }, "password": { "before": "[hidden]", "after": "[hidden]" } }" "changer_type" => "App\User" "changer_id" => 1 "stack_trace" => "{...}" "created_at" => "2020-01-21 17:34:31" ] ... }
Getting all changes history:
$testModel->historyChanges(); Illuminate\Database\Eloquent\Collection { #items: array:3 [ 0 => ModelChangesHistory\Models\Change {...} 1 => ModelChangesHistory\Models\Change {...} 2 => ModelChangesHistory\Models\Change {...} ... }
If you use database
storage you can also use morph relations to Change
model:
$testModel->latestChangeMorph(); $testModel->historyChangesMorph();
Clearing changes history:
$testModel->clearHistoryChanges();
Get an independent changes history:
use ModelChangesHistory\Facades\HistoryStorage; ... $latestChanges = HistoryStorage::getHistoryChanges(); // Return collection of all latest changes $latestChanges = HistoryStorage::getHistoryChanges($testModel); // Return collection of all latest changes for model $latestChange = HistoryStorage::getLatestChange(); // Return latest change $latestChange = HistoryStorage::getLatestChange($testModel); // Return latest change for model HistoryStorage::deleteHistoryChanges(); // This will delete all history changes HistoryStorage::deleteHistoryChanges($testModel); // This will delete all history changes for model
Getting model changer:
// Return Authenticatable `changer_type` using HasOne relation to changer_type and changer_id $changer = $latestChange->changer;
If you use database
storage you can use Change
model as:
use ModelChangesHistory\Models\Change; // Get the updates on the given model, by the given user, in the last 30 days: Change::query() ->whereModel($testModel) ->whereChanger($user) ->whereType(Change::TYPE_UPDATED) ->whereCreatedBetween(now()->subDays(30), now()) ->get();
Clearing changes history using console:
php artisan changes-history:clear
You can use it in Kelner
:
protected function schedule(Schedule $schedule) { $schedule->command('changes-history:clear')->monthly(); }