Anlatmak istediğim tek tek if property yapmak yerine dediğim gibi JSON dan tabloya dönüştürme yapabilirsiniz, sonra da sadece değişen/silinen alanları gösterirsiniz:
+===========+============+============+
| | Yeni Değer | Eski Değer |
+===========+============+============+
| Proje Adı | Proje X | Proje Y |
+-----------+------------+------------+
| Yönetici | Ali | Veli |
+-----------+------------+------------+
| Finansör | X Ajans | Y Ajans |
+-----------+------------+------------+
Modelde bir tane statik değiken oluşturmuştum, alan isimlerini tutan:
// Etiketler
public static $labels = [
'name' => 'Adı',
'title' => 'Başlık'
];
// Veritabanında json olarak tutulan değerleri çekerken array olarak çekmesi için
protected $casts = [
'old_values' => 'array',
'new_values' => 'array'
];
// Etikete ulaşmak için yardımcı yöntem
public function getLabels($key = null)
{
if (property_exists($this, 'labels')) {
$labels = static::$labels;
return is_null($key) ? $labels : (array_key_exists($key, $labels) ? $labels[$key] : $key);
} else {
return !is_null($key) ? $key : null;
}
}
gibi.
Daha sonra değişkilikleri göstermek için
// Controller içinde
public function showDifference($id)
{
/** @var SystemLog $log Günlük */
$log = SystemLog::findOrFail($id);
$oldFields = $log->old_values;
$newFields = $log->new_values;
$model = $log->loggable;
return view('show-difference', compact('oldFields', 'newFields', 'model'));
}
show-difference.blade.php
<table>
<thead>
<tr>
<th></th>
<th>Yeni Değer</th>
<th>Eski Değer</th>
</tr>
</thead>
<tbody>
@foreach($newFields as $newFieldKey => $newFieldValue)
<tr>
<th>{{ $model->getLabels($newFieldKey) }}</th>
<td>{{ $newFieldValue }}</td>
<td>{{ $oldFields[$newFieldKey] or null }}</td>
</tr>
@endforeach
</tbody>
</table>
Anlatabilmişimdir umarım.