ホームページ > バックエンド開発 > PHPチュートリアル > ロード時にLaravel Eloquentモデルにカスタム属性を追加するにはどうすればよいですか?

ロード時にLaravel Eloquentモデルにカスタム属性を追加するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-01 07:41:30
オリジナル
836 人が閲覧しました

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>
ログイン後にコピー

手動ループをスキップして、'available' 属性を自動的に設定すると便利です。

問題

ここでの問題は、モデルの 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 バージョン < 8:

オプション 1: Appends プロパティ

8 より前のバージョンの場合、$appends プロパティを使用して、シリアル化されたファイルにどの属性が含まれるかを制御できます。モデルの形式:

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

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

    public function getAvailabilityAttribute()
    {
        return $this->calculateAvailability();  
    }
}<p><strong>オプション 2: toArray() メソッドをオーバーライドする</strong></p>
<p>または、toArray() メソッドをオーバーライドして属性を手動で設定することもできます。 </p>
<pre class="brush:php;toolbar:false"><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>
ログイン後にコピー

オプション 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート