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