-
we call the
savePivotAudit
directly to avoid errors of unknown model attributes -
using
get_class($model->$relationName()->getRelated())
to avoid error of null value -
check if
$pivotIds
is avail b4 saving or we might get an error "edge case" -
removed all the extra attributes like
user, tags, url, ip, etc..
as they can be fetched from the main audit record
Last active
January 14, 2020 15:51
-
-
Save ctf0/fa929221fb801e337ad0c03ac16b27c7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
use Illuminate\Support\Facades\Schema; | |
use Illuminate\Database\Schema\Blueprint; | |
use Illuminate\Database\Migrations\Migration; | |
class CreateAuditsPivotTable extends Migration | |
{ | |
/** | |
* Run the migrations. | |
*/ | |
public function up() | |
{ | |
Schema::create('audits_pivot', function (Blueprint $table) { | |
$table->increments('id'); | |
$table->string('event'); | |
$table->morphs('auditable'); | |
$table->morphs('relation'); | |
$table->timestamps(); | |
}); | |
} | |
/** | |
* Reverse the migrations. | |
*/ | |
public function down() | |
{ | |
Schema::dropIfExists('audits_pivot'); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Traits; | |
use Fico7489\Laravel\Pivot\Traits\PivotEventTrait; | |
use OwenIt\Auditing\Auditable; | |
/** | |
* https://gist.github.com/AbbyJanke/4d245b22dbcec277c207f033f37dae3b. | |
*/ | |
trait MyAuditable | |
{ | |
use Auditable, PivotEventTrait; | |
public static function bootMyAuditable() | |
{ | |
static::pivotAttaching(function ($model, $relationName, $pivotIds, $pivotIdsAttributes) {}); | |
static::pivotAttached(function ($model, $relationName, $pivotIds, $pivotIdsAttributes) { | |
if ($pivotIds) { | |
return $model->savePivotAudit( | |
'Attached', | |
get_class($model->$relationName()->getRelated()), | |
$pivotIds[0], | |
$model->getKey() | |
); | |
} | |
}); | |
static::pivotDetaching(function ($model, $relationName, $pivotIds) {}); | |
static::pivotDetached(function ($model, $relationName, $pivotIds) { | |
if ($pivotIds) { | |
return $model->savePivotAudit( | |
'Detached', | |
get_class($model->$relationName()->getRelated()), | |
$pivotIds[0], | |
$model->getKey() | |
); | |
} | |
}); | |
static::pivotUpdating(function ($model, $relationName, $pivotIds, $pivotIdsAttributes) {}); | |
static::pivotUpdated(function ($model, $relationName, $pivotIds, $pivotIdsAttributes) {}); | |
} | |
private function savePivotAudit($eventName, $relationClass, $relationId, $modelId) | |
{ | |
return app('db')->table('audits_pivot')->insert([ | |
'event' => $eventName, | |
'auditable_id' => $modelId, | |
'auditable_type' => $this->getMorphClass(), | |
'relation_type' => $relationClass, | |
'relation_id' => $relationId, | |
'created_at' => now(), | |
'updated_at' => now(), | |
]); | |
} | |
/** | |
* normal : $model->audits | |
*/ | |
private function getPivotAudits($type, $id) | |
{ | |
return app('db')->table('audits_pivot') | |
->where('auditable_id', $id) | |
->where('auditable_type', $type) | |
->get() | |
->reverse(); | |
} | |
/** | |
* with relation : $model->auditsWithRelation | |
*/ | |
public function getAuditsWithRelationAttribute() | |
{ | |
return $this->audits->map(function ($item) { | |
$item['relations'] = $this->getPivotAudits($item->auditable_type, $item->auditable_id); | |
return $item; | |
}); | |
} | |
} |
sorry for the late reply, github still doesnt notify users of gist activities :(
anyway am using the same solution in a package i made call odin and am simply including that trait in every model i want to have revisions of
so an answer to ur question i would probably suggest adding the trait to both ur Video and Status models
or if u have the laravel v5.8 then modify the above logic to work with the pivot events https://laravel.com/docs/5.8/releases
For anyone coming across this and wondering if it will work in combination with Nova. It doesn't.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I need to implement something in Laravel 5.6 with Laravel auditing 8.0 and current laravel-pivot, I have configured my application as you suggested, but not using the trait in base Model, I have video_status pivot where I want to implement this, so should I use it in Video and Status model or VideoStatus pivot? also, I would like to know, if I need to save the data manually to the audit_pivots table or it will save directly?