ロード時に 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 サイトの他の関連記事を参照してください。