Polymorphic Laravel Auditing Package - Retrieving polymorphic audits

1.2k Views Asked by At

I am currently using Laravel Auditing (Owen-it) package to audit models automatically which is working great using the following code.

class Staff extends Model implements Auditable
{
   use \OwenIt\Auditing\Auditable;
   use SoftDeletes;

}
class Customer extends Model implements Auditable
{
   use \OwenIt\Auditing\Auditable;
   use SoftDeletes;

}

Seeing as there is a significant number of fields (> 20) on these classes I am intending to convert these classes to a polymorphic relationship where all common fields reside in the base class and any class unique properties will go in their respective classes.

For example - the base class:

class User extends Model implements Auditable
{
   use \OwenIt\Auditing\Auditable;
   use SoftDeletes;

} 

Currently I use something like this to retrieve audits:

$staff = App\Model\Staff::find($id);
$allAudits= $staff->audits;

My question is then is there a clean way to retrieve all audits across the base and morphed class?

Thanks in advance.

1

There are 1 best solutions below

0
Quetzy Garcia On BEST ANSWER

My question is then is there a clean way to retrieve all audits across the base and morphed class?

You could add the following method to your base class in order to fetch all audits:

public function getAllAudits(): Collection
{
    return Audit::where(function ($query) {
        $query->where('auditable_type', get_class($this))
            ->where('auditable_id', $this->id);
    })
    ->orWhere(function ($query) {
        $morph = $this->userable; // or whatever morph relation name you have set

        $query->where('auditable_type', get_class($morph))
            ->where('auditable_id', $morph->id);
    })
    ->get();
}