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

Patricia Arquette
リリース: 2024-11-04 05:41:29
オリジナル
553 人が閲覧しました

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

ロード時の Laravel/Eloquent モデルのカスタム属性

最初の段階で Eloquent モデルにカスタム属性を追加しようとすると課題が発生しますロードされています。これにより、ループを使用して手動で属性を設定する必要がなくなります。モデル イベントは調査されましたが、望ましい結果は得られませんでした。

解決策

根本的な問題は、データベースに直接対応しないアクセサーを無視する toArray() メソッドに起因します。テーブルの列。ただし、Laravel は簡単​​な回避策を提供しています:

Laravel >= 8.0

カスタム属性を計算するゲッター関数を備えた Attribute クラスを導入します:

<code class="php">class EventSession extends Eloquent {
    public function availability()
    {
        return new Attribute(get: fn () => $this->calculateAvailability());
    }
}</code>
ログイン後にコピー

Laravel < 8.0 および >= 4.08

$appends プロパティにカスタム属性を追加し、ゲッター アクセサーを定義します。

<code class="php">class EventSession extends Eloquent {
    protected $appends = ['availability'];
    public function getAvailabilityAttribute()
    {
        return $this->calculateAvailability();
    }
}<p><strong>Laravel < 4.08</strong></p><p>toArray() メソッドをオーバーライドして属性を明示的に設定するか、変更された属性をループして値を取得します:</p><pre class="brush:php;toolbar:false"><code class="php">class EventSession extends Eloquent {
    public function toArray()
    {
        $array = parent::toArray();
        $array['availability'] = $this->availability;
        return $array;
    }
}<p>または</p>
<pre class="brush:php;toolbar:false"><code class="php">class EventSession extends Eloquent {
    public function toArray()
    {
        $array = parent::toArray();
        foreach ($this->getMutatedAttributes() as $key) {
            $array[$key] = $this->$key;
        }
        return $array;
    }
}</code>
ログイン後にコピー

これらのソリューションを実装すると、ロード時にカスタム属性を Eloquent モデルに簡単に追加できるため、手動で属性を入力する必要がなくなります。

以上がロード時にLaravel/Eloquentモデルにカスタム属性を追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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