[解決済み] ロード時にLaravel / Eloquentモデルにカスタム属性を追加しますか?
2022-04-17 17:48:05
質問
Laravel/Eloquentのモデルがロードされたときに、カスタム属性/プロパティを追加できるようにしたいのです。
RedBeanの
$model->open()
メソッドを使用します。
例えば、今現在、私のコントローラでは、以下のようになっています。
public function index()
{
$sessions = EventSession::all();
foreach ($sessions as $i => $session) {
$sessions[$i]->available = $session->getAvailability();
}
return $sessions;
}
ループを省略して、'available' 属性がすでに設定され、入力されるようにできるといいのですが。
ドキュメントに記載されているモデルイベントのいくつかを使って、オブジェクトがロードされたときにこのプロパティをアタッチしようとしましたが、今のところ成功しません。
注意事項
- 'available'は基礎となるテーブルのフィールドではありません。
-
$sessions
は、APIの一部としてJSONオブジェクトとして返されるため、以下のような呼び出しが行われます。$session->available()
をテンプレートで使用することはできません。
解決方法は?
この問題の原因は
Model
's
toArray()
メソッドは、基礎となるテーブルのカラムに直接関係しないアクセサは無視します。
Taylor Otwell が述べたように ここで しかし、これを簡単に実現する方法があります。
class EventSession extends Eloquent {
protected $table = 'sessions';
protected $appends = array('availability');
public function getAvailabilityAttribute()
{
return $this->calculateAvailability();
}
}
適切なアクセサを追加していれば、$appends プロパティにリストされた属性は、自動的にモデルの配列または JSON 形式に含まれます。
古い回答です(Laravelバージョン< 4.08の場合)。
私が発見した最良の解決策は、このメソッドをオーバーライドすることです。
toArray()
メソッドを使用して、明示的に属性を設定します。
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);
}
}
または、カスタムアクセサがたくさんある場合は、それらをすべてループして適用します。
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);
}
}
関連
-
[解決済み] 整形されていない数値が発生しました。
-
[解決済み] SQLSTATE[HY093]: 無効なパラメータ番号: バインドされた変数の数が102行目のトークンの数と一致しない [終了]
-
[解決済み] php5パッケージのインストール候補がない (Ubuntu 16.04)
-
[解決済み】PHP フェイタルエラー。未定義の関数mssql_connect()をコールしています。
-
[解決済み] Laravel Eloquentを使用して複数のWhere句クエリを作成する方法?
-
[解決済み] Laravel Eloquentを使って最後に挿入されたIDを取得する
-
[解決済み] Laravel Eloquent クエリ WHERE を OR AND OR で使用する?
-
[解決済み】Laravel - EloquentまたはFluentランダム行
-
[解決済み】Laravel - Eloquent "Has", "With", "WhereHas" - これらの意味は何ですか?
-
[解決済み】Laravel EloquentのWith()関数で特定のカラムを取得する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Fatal error: メンバ関数prepare()のNULLでの呼び出し
-
[解決済み】SQLSTATE[42000]: 構文エラーまたはアクセス違反が発生しました。1064 SQL 構文にエラーがあります - PHP - PDO [重複]。
-
[解決済み】 PHP 未定義関数の呼び出し
-
[解決済み】新しいPHPMailerはPHPMailerAutoload.phpが必要?
-
[解決済み] php5パッケージのインストール候補がない (Ubuntu 16.04)
-
[解決済み] $wpdb->update または $wpdb->insert を実行すると、引用符の前にスラッシュが追加される
-
[解決済み】PDOException SQLSTATE[HY000] [2002] そのようなファイルまたはディレクトリがありません。
-
[解決済み] PHP と mod_fcgid: handle_request_ipc 関数で ap_pass_brigade が失敗する。
-
[解決済み] SSLエラー SSL3_GET_SERVER_CERTIFICATE:証明書の検証に失敗しました。
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?