Podczas pracy z modelami Eloquent czasami potrzebne są tylko podstawowe atrybuty bazy danych bez relacji lub obliczonych właściwości. Metoda attributesToArray firmy Laravel zapewnia przejrzysty sposób uzyskiwania dostępu do tych nieprzetworzonych danych modelu.
// Basic usage
$user = User::first();
$attributes = $user->attributesToArray();
// Returns raw database attributes
// ['id' => 1, 'name' => 'John', 'email' => '[email protected]']
Przyjrzyjmy się praktycznemu przykładowi implementacji systemu audytu zmian modelu:
<?php
namespace App\Models;
use App\Models\AuditLog;
use Illuminate\Database\Eloquent\Model;
class AuditableModel extends Model
{
protected static function booted()
{
static::updated(function ($model) {
$original = $model->getOriginal();
$current = $model->attributesToArray();
// Compare only actual database attributes
$changes = array_diff($current, $original);
if (!empty($changes)) {
AuditLog::create([
'model_type' => get_class($model),
'model_id' => $model->id,
'original' => json_encode($original),
'changes' => json_encode($changes),
'user_id' => auth()->id(),
'timestamp' => now()
]);
}
});
}
}
class Product extends AuditableModel
{
protected $appends = ['formatted_price', 'stock_status'];
public function category()
{
return $this->belongsTo(Category::class);
}
public function getFormattedPriceAttribute()
{
return "$" . number_format($this->price / 100, 2);
}
}
Metoda attributesToArray zapewnia bezpośredni dostęp do atrybutów modelu przechowywanych w bazie danych, dzięki czemu idealnie nadaje się do scenariuszy, w których potrzebne są surowe dane bez dodatkowych obliczonych właściwości lub relacji.