首頁  >  文章  >  後端開發  >  如何在載入時為 Laravel Eloquent 模型新增自訂屬性?

如何在載入時為 Laravel Eloquent 模型新增自訂屬性?

Patricia Arquette
Patricia Arquette原創
2024-11-01 07:41:30754瀏覽

How to Add Custom Attributes to Laravel Eloquent Models on Load?

如何在載入時為 Laravel Eloquent 模型新增自訂屬性?

在 Laravel Eloquent 中,你可能會遇到這樣的場景:載入模型時的自訂屬性。例如,考慮這樣的控制器:

<code class="php">public function index()
{
    $sessions = EventSession::all();
    foreach ($sessions as $i => $session) {
        $sessions[$i]->available = $session->getAvailability();
    }
    return $sessions;
}</code>

跳過手動循環並自動填充「可用」屬性會很方便。

問題

這裡的問題是模型的 toArray() 方法會忽略與基礎表中的欄位不對應的存取器。這是出於性能原因而有意設計的。

解決方案

Laravel 版本>= 8:

幸運的是,有一種優雅的方法可以使用Attribute類別來達成此目的:

<code class="php">class EventSession extends Eloquent {

    protected $table = 'sessions';

    public function availability()
    {
        return new Attribute(
            get: fn () => $this->calculateAvailability()
        );  
    }
}</code>

Laravel Versions Laravel Versions

Laravel Versions 8:Laravel Versions

8:

<code class="php">class EventSession extends Eloquent {

    protected $table = 'sessions';
    protected $appends = array('availability');

    public function getAvailabilityAttribute()
    {
        return $this->calculateAvailability();  
    }
}</code>

對於小於8 的版本,可以使用$appends 屬性來控制序列化中包含哪些屬性模型的形式:

選項2:重寫toArray() 方法

<code class="php">class Book extends Eloquent {

    protected $table = 'books';
    
    public function toArray()
    {
        $array = parent::toArray();
        $array['upper'] = $this->upper;
        return $array;
    }
    
    public function getUpperAttribute()
    {
        return strtoupper($this->title);    
    }

}</code>

或者,您可以重寫toArray() 方法並手動設定屬性:

選項3:循環遍歷變異屬性

<code class="php">class Book extends Eloquent {

    protected $table = 'books';
    
    public function toArray()
    {
        $array = parent::toArray();
        foreach ($this->getMutatedAttributes() as $key)
        {
            if ( ! array_key_exists($key, $array)) {
                $array[$key] = $this->{$key};   
            }
        }
        return $array;
    }
    
    public function getUpperAttribute()
    {
        return strtoupper($this->title);    
    }

}</code>
如果您有多個自訂存取器,您可以迭代它們並在序列化期間應用它們:

以上是如何在載入時為 Laravel Eloquent 模型新增自訂屬性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn