使用 Laravel 的 attributeToArray 方法访问原始模型数据

2024 年 12 月 31 日

使用 Eloquent 模型时,有时您只需要核心数据库属性,而不需要关系或计算属性。Laravel 的 attributeToArray 方法提供了一种简洁的方式来访问此原始模型数据。

// Basic usage
$user = User::first();
$attributes = $user->attributesToArray();
// Returns raw database attributes
// ['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();
            
            // 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);
    }
}

attributesToArray 方法提供对存储在数据库中的模型属性的直接访问,这使其非常适合需要原始数据而不需要额外的计算属性或关系的场景。


帖子 使用 Laravel 的 attributeToArray 方法访问原始模型数据 首先出现在 Laravel 新闻

加入 Laravel 时事通讯 获取最新信息 类似这样的 Laravel 文章将直接发送到您的收件箱。