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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-11-04 13:15:29506ブラウズ

How to Add a Custom Attribute to a Laravel/Eloquent Model on Load?

ロード時に Laravel/Eloquent モデルにカスタム属性を追加する

問題分析

Laravel/Eloquent では、カスタム属性はモデルに直接関係しませんモデルを toArray() または JSON 形式に変換する場合、基になるテーブルの列は除外されます。

ソリューション

Laravel 8 以降:

オブジェクトのロード時に属性を自動的に計算して割り当てるカスタム アクセサーを作成するための属性クラス。

<code class="php">class EventSession extends Eloquent {
  public function availability() {
    return new Attribute(
      get: fn () => $this->calculateAvailability()
    );
  }
}</code>

Laravel 7 以前:

オプション 1 : $appends プロパティに属性を追加

$appends 配列にカスタム属性を追加し、適切なアクセサーを定義します。

<code class="php">class EventSession extends Eloquent {
  protected $appends = ['availability'];
  public function getAvailabilityAttribute() {
    return $this->calculateAvailability();
  }
}</code>

オプション 2: toArray() をオーバーライドします。メソッド

toArray() メソッドをオーバーライドし、カスタム属性を明示的に設定または反復します。

<code class="php">class Book extends Eloquent {
  public function toArray() {
    $array = parent::toArray();
    $array['upper'] = $this->upper;
    return $array;
  }
  public function getUpperAttribute() {
    return strtoupper($this->title);
  }
}</code>

オプション 3: 変更された属性をループする

モデルの変更された属性をループし、それらを toArray() 配列に適用します。

<code class="php">class Book extends Eloquent {
  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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。