Отримання сирих даних моделі за допомогою методу attributesToArray у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 01 січня, 2025
Використання моделі Eloquent у Laravel відкриває нові можливості, однак іноді виникає потреба отримати лише "сирі" атрибути бази даних без зв'язків і обчислених властивостей. Дізнайтеся, як метод attributesToArray може спростити вашу роботу та забезпечити доступ до важливої інформації вашої моделі!

Під час роботи з моделями Eloquent іноді потрібні лише основні атрибути бази даних, без зв'язків або обчислених властивостей. Метод attributesToArray у Laravel надає зручний спосіб доступу до цих сирих даних моделі.

// Основне використання
$user = User::first();
$attributes = $user->attributesToArray();
// Повертає сирі атрибути бази даних
// ['id' => 1, 'name' => 'John', 'email' => 'john@example.com']

Розглянемо практичний приклад реалізації системи аудиту змін моделі:

<?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();
 
            // Порівнюємо лише фактичні атрибути бази даних
            $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);
    }
}

Метод attributesToArray забезпечує прямий доступ до атрибутів моделі, як вони зберігаються в базі даних, що робить його ідеальним для ситуацій, коли вам потрібні сирі дані без додаткових обчислених властивостей або зв'язків