2017-12-18 38 views
0

モデルのReviewは、そのうちの1つ(テーブルcolumms)としてunixタイムスタンプを持っています。Laravel Eloquentアクセサがレスポンスに表示されないのはなぜですか?

私は、このモデルの内側に2 accessorsを使用します。

public function getReviewDateAttribute($value) 
{ 
    return strftime('%A %e %B %Y', $value); 
} 

public function getReviewDateIsoAttribute() 
{ 
    return Carbon::createFromTimestamp($this->review_date)->toDateTimeString(); 
} 

getReviewDateAttributeは期待通りに動作し、私は、クエリを記述する際にモデルのコレクションに表示されます。

ただし、getReviewDateIsoAttributeはありません。これの理由は何でしょうか? サブクエリ:両方の関数で同じ属性を使用する場合、どのように入力値として元の形式を使用できますか?

enter image description here

答えて

3

あなたは$appends配列に追加する必要があります。利用可能なすべての方法で、getXXXXXAttributeを探していません。もう1つは、実際の属性のアクセサーであるために使用されます。これは実際の属性ではありません。

class YourModel .... 
{ 
    protected $appends = ['review_date_iso']; 
    ... 
} 

Laravel 5.5 Docs - Eloquent - Serialization - Appending Values to JSON

1

ReviewDateIsoは、実際の列ではありませんので、モデルのコレクションには表示されません...あなたは方法直接

$model->getReviewDateIsoAttribute() 
呼び出すことによって直接アクセスすることができますので、これはおそらくです

docsアクセサによれば、列の値を問い合わせるメソッドに戻す前に、列の値を変更する方法があります。

あなたはJSONは、実際には

protected $appends = ['name_of_attribute']; 
+1

私はあなたが何を言おうとしているのか理解していますが、Laravelのアクセサは、その場で属性を作成する「魔法の」関数なので、これでも動作するはずです。ドキュメントの 'getFullNameAttribute'の例を見てください。 –

+0

クエリの構造と関係があります。 https://laracasts.com/discuss/channels/laravel/custom-accessor-not-working-anymoreのような問題へのリンクがあります。 – carrion

0

と出力に追加してコレクションを呼び出すときに表示したい場合、それはあなたが達成しようとしているかに依存します。たとえば、Bladeに何かを表示する場合は、$object->review_date_isoにこの属性値を取得するたびに使用できます。

しかし、Jsonレスポンス(APIなど)を返す場合は、JSON形式に変換する際にEloquentモデルにモデルに追加フィールドを追加する必要があります。

あなたはおそらく、あなたのモデルにreview_date属性を持っている(これは私が思うデータベースの列である)が、あなたのモデルで使用する必要があるので、あなたは、データベース内のテーブルでreview_date_isoを持っていない:

protected $appends = ['review_date_iso']; 

しかし、ここにreview_dateを含める必要はありません。データベース内のテーブルに既に入っているため、アクセサが自動的に起動されるためです。

関連する問題